Sql 找到贝利';蓝色大手帕
想象一下,舞蹈队(大小不一)可以选择一套或多套服装,每套服装可以有一件或多件物品。一个团队的所有成员必须拥有所有相同的装备,每个装备的所有项目,也就是说,不完整的装备是不好的——我们希望找到那些不好的装备 下表定义了两个团队:苹果和香蕉。苹果团队有3名成员,香蕉团队有2名成员。苹果选择了一套只有一个项目的套装,黄色的连裤套装,自然是大众的最爱。香蕉队有两套服装:红色和蓝色;但是,贝利却错过了蓝色套装的大手帕。尴尬 让我们把贝利从麻烦中解救出来。创建查询以查找团队选择的装备中缺少的项目 感谢@Brits提供以下SQL: 团队和团队成员:Sql 找到贝利';蓝色大手帕,sql,postgresql,Sql,Postgresql,想象一下,舞蹈队(大小不一)可以选择一套或多套服装,每套服装可以有一件或多件物品。一个团队的所有成员必须拥有所有相同的装备,每个装备的所有项目,也就是说,不完整的装备是不好的——我们希望找到那些不好的装备 下表定义了两个团队:苹果和香蕉。苹果团队有3名成员,香蕉团队有2名成员。苹果选择了一套只有一个项目的套装,黄色的连裤套装,自然是大众的最爱。香蕉队有两套服装:红色和蓝色;但是,贝利却错过了蓝色套装的大手帕。尴尬 让我们把贝利从麻烦中解救出来。创建查询以查找团队选择的装备中缺少的项目 感谢@Br
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
添加到团队
),还是每个团队都必须拥有其中一种装备中的所有项目?如果是前者,那么我的查询可以很容易地更新(另一个连接条件);后者需要更多的信息。将更新我的示例以显示(不更改表结构)后者;团队与装备之间的唯一联系是队员与物品的联系。如果一个成员有装备项目,那么其余的装备项目是必需的,其他团队成员也必须有装备项目。好的-这是相当简单的工作;回答已更新。你是对的——对不起——我把商品号和服装号混在一起了……现在更新问题。嗯——我不得不对表名进行一些编辑,但没有返回结果,只有一行。