【问题标题】:How to get a group with exactly the group members listed?如何获得与列出的组成员完全相同的组?
【发布时间】:2021-10-24 05:51:49
【问题描述】:

一支足球队有 1 名或多名球员。一名球员属于 1 个或多个足球队。我有一个球员名单:'Bob', 'James', 'Sam' 我想知道哪支球队有这些球员。所以结果将是Red Team,因为Red Team 是唯一一个拥有完全'Bob', 'James', 'Sam' 的团队。请保留我所有的连接。我知道从技术上讲,您可以在 members 表中完成所有操作,但为了简单起见,我只是这样构建它。

CREATE TABLE teams(
  name VARCHAR(25) PRIMARY KEY
);

CREATE TABLE players(
  name VARCHAR(25) PRIMARY KEY
);

CREATE TABLE members(
  team_name VARCHAR(25) NOT NULL,
  player_name VARCHAR(25) NOT NULL,
  CONSTRAINT FK_team_name FOREIGN KEY (team_name) REFERENCES teams(name),
  CONSTRAINT FK_player_name FOREIGN KEY (player_name) REFERENCES players(name)
);

INSERT INTO teams(name) VALUES ('Blue Team');
INSERT INTO teams(name) VALUES ('Red Team');
INSERT INTO teams(name) VALUES ('Green Team');
INSERT INTO teams(name) VALUES ('Purple Team');

INSERT INTO players(name) VALUES ('Bob');
INSERT INTO players(name) VALUES ('Sarah');
INSERT INTO players(name) VALUES ('James');
INSERT INTO players(name) VALUES ('Mike');
INSERT INTO players(name) VALUES ('Sam');

INSERT INTO members(team_name, player_name) VALUES ('Blue Team', 'Bob');
INSERT INTO members(team_name, player_name) VALUES ('Green Team', 'Bob');
INSERT INTO members(team_name, player_name) VALUES ('Green Team', 'Sam');
INSERT INTO members(team_name, player_name) VALUES ('Green Team', 'James');
INSERT INTO members(team_name, player_name) VALUES ('Green Team', 'Sarah');
INSERT INTO members(team_name, player_name) VALUES ('Red Team', 'Bob');
INSERT INTO members(team_name, player_name) VALUES ('Red Team', 'Sam');
INSERT INTO members(team_name, player_name) VALUES ('Red Team', 'James');
INSERT INTO members(team_name, player_name) VALUES ('Purple Team', 'Mike');
INSERT INTO members(team_name, player_name) VALUES ('Purple Team', 'Sam');

我的 SQL 语句:

SELECT DISTINCT
  t.name
FROM teams t
LEFT JOIN members m
  ON t.name = m.team_name
LEFT JOIN players p
  ON m.player_name = p.name
WHERE
  m.player_name in ('Bob', 'James', 'Sam')

【问题讨论】:

    标签: sql oracle select


    【解决方案1】:

    您可以使用聚合和having 子句。如果您想要正是这些成员,那么您可以在having 子句中进行过滤。以下假设成员不能在团队中重复:

    SELECT t.name
    FROM teams t JOIN
         members m
         ON t.name = m.team_name JOIN
         players p
         ON m.player_name = p.name
    GROUP BY t.name
    HAVING SUM(CASE WHEN m.player_name IN ('Bob', 'James', 'Sam') THEN 1 ELSE 0 END) = 3 AND
           COUNT(*) = 3;
    

    编辑:

    另一种方法是使用LISTAGG()

    SELECT t.name
    FROM teams t JOIN
         members m
         ON t.name = m.team_name JOIN
         players p
         ON m.player_name = p.name
    GROUP BY t.name
    HAVING LISTAGG(m.player_name, ',') WITHIN GROUP (ORDER BY m.player_name) = 'Bob,James,Sam';
    

    Here 是一个 dbfiddle。

    如果您只想传入一个参数,这会很方便。但是,名称必须按照正确的顺序进行比较。

    【讨论】:

    • 您在 SQL 语句中输入了两次数字3。这是因为列表中有 3 个成员吗?如果是,有没有一种方法可以让我以编程方式做到这一点,这样我就不用输入3
    • @ZoeyMalkov 请不要说不起作用,因为我们看不到您的屏幕。发布实际的错误消息或解释您认为有什么问题
    • @ZoeyMalkov 。 . .有用。我添加了一个 dbfiddle.
    • @astentx 对不起,我的错。我说它不起作用,因为它没有返回任何结果
    • @GordonLinoff 编辑后现在可以使用。我相信编辑删除了名称列表之间的空格。
    猜你喜欢
    • 2014-09-18
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多