Sql 找到贝利';蓝色大手帕

Sql 找到贝利';蓝色大手帕,sql,postgresql,Sql,Postgresql,想象一下,舞蹈队(大小不一)可以选择一套或多套服装,每套服装可以有一件或多件物品。一个团队的所有成员必须拥有所有相同的装备,每个装备的所有项目,也就是说,不完整的装备是不好的——我们希望找到那些不好的装备 下表定义了两个团队:苹果和香蕉。苹果团队有3名成员,香蕉团队有2名成员。苹果选择了一套只有一个项目的套装,黄色的连裤套装,自然是大众的最爱。香蕉队有两套服装:红色和蓝色;但是,贝利却错过了蓝色套装的大手帕。尴尬 让我们把贝利从麻烦中解救出来。创建查询以查找团队选择的装备中缺少的项目 感谢@Br

想象一下,舞蹈队(大小不一)可以选择一套或多套服装,每套服装可以有一件或多件物品。一个团队的所有成员必须拥有所有相同的装备,每个装备的所有项目,也就是说,不完整的装备是不好的——我们希望找到那些不好的装备

下表定义了两个团队:苹果和香蕉。苹果团队有3名成员,香蕉团队有2名成员。苹果选择了一套只有一个项目的套装,黄色的连裤套装,自然是大众的最爱。香蕉队有两套服装:红色和蓝色;但是,贝利却错过了蓝色套装的大手帕。尴尬

让我们把贝利从麻烦中解救出来。创建查询以查找团队选择的装备中缺少的项目

感谢@Brits提供以下SQL:

团队和团队成员:

CREATE TABLE team (
    id   int unique,
    name text
);
INSERT INTO team (id, name)
VALUES (1, 'APPLE'),
       (2, 'BANANA');

CREATE TABLE team_member (
    id      int unique,
    name    text,
    team_id int references team (id)
);
INSERT INTO team_member (id, name, team_id)
VALUES (1, 'ADAM', 2),
       (2, 'BAILEY', 2),
       (3, 'CATE', 1),
       (4, 'DAVE', 1),
       (5, 'ERIN', 1);
CREATE TABLE outfit (
    id   int unique,
    name text
);
INSERT INTO outfit (id, name)
VALUES (1, 'RED'),
       (2, 'YELLOW'),
       (3, 'BLUE');

CREATE TABLE outfit_item (
    id        int unique,
    name      text,
    outfit_id int references outfit (id)
);
INSERT INTO outfit_item (id, name, outfit_id)
VALUES (1, 'SHORTS', 1),
       (2, 'SHIRT', 1),
       (3, 'PANTSUIT', 2),
       (4, 'BANDANNA', 3),
       (5, 'HAT', 3);
CREATE TABLE member_item (
    member_id int references team_member (id),
    item_id   int references outfit_item (id)
);

INSERT INTO member_item (member_id, item_id)
VALUES (1, 1),
       (1, 2),
       (1, 4),
       (1, 5),
       (2, 1),
       (2, 2),
       (2, 5),
       (3, 3),
       (4, 3),
       (5, 3);
服装和装备项目:

CREATE TABLE team (
    id   int unique,
    name text
);
INSERT INTO team (id, name)
VALUES (1, 'APPLE'),
       (2, 'BANANA');

CREATE TABLE team_member (
    id      int unique,
    name    text,
    team_id int references team (id)
);
INSERT INTO team_member (id, name, team_id)
VALUES (1, 'ADAM', 2),
       (2, 'BAILEY', 2),
       (3, 'CATE', 1),
       (4, 'DAVE', 1),
       (5, 'ERIN', 1);
CREATE TABLE outfit (
    id   int unique,
    name text
);
INSERT INTO outfit (id, name)
VALUES (1, 'RED'),
       (2, 'YELLOW'),
       (3, 'BLUE');

CREATE TABLE outfit_item (
    id        int unique,
    name      text,
    outfit_id int references outfit (id)
);
INSERT INTO outfit_item (id, name, outfit_id)
VALUES (1, 'SHORTS', 1),
       (2, 'SHIRT', 1),
       (3, 'PANTSUIT', 2),
       (4, 'BANDANNA', 3),
       (5, 'HAT', 3);
CREATE TABLE member_item (
    member_id int references team_member (id),
    item_id   int references outfit_item (id)
);

INSERT INTO member_item (member_id, item_id)
VALUES (1, 1),
       (1, 2),
       (1, 4),
       (1, 5),
       (2, 1),
       (2, 2),
       (2, 5),
       (3, 3),
       (4, 3),
       (5, 3);
团队成员装备项目:

CREATE TABLE team (
    id   int unique,
    name text
);
INSERT INTO team (id, name)
VALUES (1, 'APPLE'),
       (2, 'BANANA');

CREATE TABLE team_member (
    id      int unique,
    name    text,
    team_id int references team (id)
);
INSERT INTO team_member (id, name, team_id)
VALUES (1, 'ADAM', 2),
       (2, 'BAILEY', 2),
       (3, 'CATE', 1),
       (4, 'DAVE', 1),
       (5, 'ERIN', 1);
CREATE TABLE outfit (
    id   int unique,
    name text
);
INSERT INTO outfit (id, name)
VALUES (1, 'RED'),
       (2, 'YELLOW'),
       (3, 'BLUE');

CREATE TABLE outfit_item (
    id        int unique,
    name      text,
    outfit_id int references outfit (id)
);
INSERT INTO outfit_item (id, name, outfit_id)
VALUES (1, 'SHORTS', 1),
       (2, 'SHIRT', 1),
       (3, 'PANTSUIT', 2),
       (4, 'BANDANNA', 3),
       (5, 'HAT', 3);
CREATE TABLE member_item (
    member_id int references team_member (id),
    item_id   int references outfit_item (id)
);

INSERT INTO member_item (member_id, item_id)
VALUES (1, 1),
       (1, 2),
       (1, 4),
       (1, 5),
       (2, 1),
       (2, 2),
       (2, 5),
       (3, 3),
       (4, 3),
       (5, 3);
苹果队的队员都穿着黄色的运动裤,所以苹果随时都会发出隆隆声

香蕉队选择了红色和蓝色的服装;可悲的是,我没能给香蕉队一套黄色的连裤套装——他们会杀了它,但不管怎样。香蕉队的亚当和贝利拥有红色套装的物品,但贝利没有蓝色套装的大手帕;我们不要让大手帕妨碍到香蕉队,所以我们需要一个查询来返回:

BANANA BAILEY BLUE BANDANNAS
要查找装备中的物品数量,请执行以下操作:

SELECT
  o.name
, count(*) AS "number of items"
FROM
  outfit_item i
, outfit o
WHERE
  i.outfit_id = o.id
GROUP BY
  i.outfit_id
, o.name

  name  | number of items 
--------+-----------------
 RED    |               2
 BLUE   |               2
 YELLOW |               1
同样,团队中的成员数量:

SELECT
  t.name
, count(*) AS "number of members"
FROM
  team_member m
, team t
WHERE
  m.team_id = t.id
GROUP BY
  m.team_id
, t.name

  name  | number of members 
--------+-------------------
 BANANA |                 2
 APPLE  |                 3

这一切都很好,但我们如何结合这些信息,才能让贝利摆脱这一香蕉错误?

已确认为博士后工作,尽管并不漂亮,我85%确信这可以简化。此外,我对服装和服装项目表之间的关系有点困惑。在你布置桌子的方式中,当你加入一套又一套的衣服时,头巾和帽子总是蓝色的,长裤总是黄色的,短裤/衬衫总是红色的(install.id=install\u item.install\u id)。测试数据和查询就是基于这种理解编写的

    select distinct 
    tm.name as member_name,
    t.name as team_name,
    o.name as outfit_color, 
    oi.name as outfit_item
    from team_member tm
    join team t 
        on t.id = tm.team_id
    join member_items mi 
        on mi.member_id = tm.id
    join(
        with outfit_item_count as
            (SELECT outfit_id, count(*) AS items 
            FROM outfit_items 
            GROUP BY 1)
        select mi.member_id, oi.outfit_id, oic.items as items_needed, count(mi.item_id) as member_item_count 
        from member_items mi
        join outfit_items oi on oi.id = mi.item_id
        join outfit_item_count oic on oic.outfit_id = oi.outfit_id
        group by 1,2,3)z 
        on z.member_id = tm.id
    join outfit_items oi 
        on oi.outfit_id = z.outfit_id
    join outfit o 
        on o.id = oi.outfit_id
    where z.items_needed > z.member_item_count
    and oi.id not in (select item_id from member_items)

考虑到“如果任何成员都有装备,那么所有团队成员都必须拥有该装备中的所有装备”这句话,我相信以下内容将满足您的需求(我正在使用CTE来确定哪些装备与每个团队相关)

输出:

|   team | member | outfit |     item |
|--------|--------|--------|----------|
| BANANA | BAILEY |   BLUE | BANDANNA |

我设置了一个你可以用来玩这个游戏(如果我误解了你的意图,也许可以澄清你的问题)。

为什么在成员项目中有重复的(成员id,项目id)?为什么你选择不使用正确的、明确的、标准的、可读的
JOIN
语法?你怎么知道贝利应该拥有什么样的装备呢?在这个例子中,可能没有很好的动机,但是在激励问题上,团队是很重要的。
交叉连接
不是有效的假设;我更新了这个问题,希望能澄清这一点,并从小提琴上添加了您的SQL——谢谢您!!!那么,您知道每个团队选择了哪种装备(当前数据模型中未显示-需要将
装备id
添加到
团队
),还是每个团队都必须拥有其中一种装备中的所有项目?如果是前者,那么我的查询可以很容易地更新(另一个连接条件);后者需要更多的信息。将更新我的示例以显示(不更改表结构)后者;团队与装备之间的唯一联系是队员与物品的联系。如果一个成员有装备项目,那么其余的装备项目是必需的,其他团队成员也必须有装备项目。好的-这是相当简单的工作;回答已更新。你是对的——对不起——我把商品号和服装号混在一起了……现在更新问题。嗯——我不得不对表名进行一些编辑,但没有返回结果,只有一行。