根据sql中多列的集合读取详细信息

问题描述 投票:0回答:1

我需要从数据库表中读取数据。 有两个表,一个是体育联赛表,其中包含联赛的详细信息,另一个表包含每个联赛中的所有球员。玩家可以参加任意数量的联赛。

示例数据如下所示。

LEAGUE_TEAM                         
_______________                 
ID      NAME    
____  ________
1       EPL
2       IPL
3       CPL
4       BPL
5       BBL

        PLAYER_DETAILS
    _______________________         
LEAGUE_ID       PLAYER_LAST_NAME   PLAYER_FIRST_NAME
___________  ___________________   _________________

1               Silva               Thiago
2               Silva               Thiago
3               Silva               Thiago
1               Lampard             Frank
2               Lampard             Frank
1               Caballero           Willy
2               Caballero           Willy
3               Caballero           Willy
4               Caballero           Willy
5               Caballero           Willy
4               Mount               Mason

输入数据是json格式的玩家姓名集合,其中包括last_name和first_name。使用提供的球员姓名列表,我应该确定这些球员属于哪个联赛。

例如:如果输入的详细信息是

1.

last_name       first_name
__________      ___________
silva           Thiago
Caballero       Willy

sql 查询应该得到联赛 1,2 和 3 的详细信息,因为这两名球员同时参加 EPL、IPL 和 CPL 联赛。

2.

last_name       first_name
__________      ___________
Lampard         Frank
Caballero       Willy

sql 查询应该得到联赛 1 和 2 的详细信息,因为这两名球员同时参加 EPL 和 IPL 联赛。

3.

last_name       first_name
__________      ___________
Mount           Mason
Caballero       Willy

sql 查询应该得到联赛 4 的详细信息,因为这两名球员同时参加 BPL 联赛。

到目前为止我得到的只是简单的sql查询,

SELECT lt.* FROM LEAGUE_TEAM lt
    INNER JOIN PLAYER_DETAILS pd ON pd.league_id = lt.id
    WHERE pd.last_name = :last_name and pd.first_name = :first_name

使用此查询,

  1. 我将首先阅读给定集合中一名球员的联赛详细信息。
  2. 然后读取步骤 1 中得出的联赛中的所有球员。
  3. 迭代第 2 步中的所有玩家并与输入列表中的剩余玩家进行比较。

这是一个非常乏味的过程,我没有留下深刻的印象。只是想从社区获得帮助,如果有任何 SQL 查询可以用来获得预期的结果。 预先感谢您的所有支持和帮助。

环境:

Postgresql 16
Java 11 for programming
java sql postgresql oracle
1个回答
0
投票

类似这样,HAVING中的条件:

SELECT id
     , name
     , array_agg(DISTINCT player_last_name ORDER BY player_last_name) -- to validate the output
FROM league_team
    JOIN player_details ON league_team.id = player_details.league_id
WHERE (player_last_name = 'Silva' AND player_first_name = 'Thiago')
OR    (player_last_name = 'Caballero' AND player_first_name = 'Willy')
GROUP BY id, name
HAVING count(*) = 2; -- 2 players
© www.soinside.com 2019 - 2024. All rights reserved.