我在争夺冠军头衔,但让我解释一下:
假设我有两种数据结构:Parent
和Child
。在我的(Scala)代码中,每个Parent
实例都有一个Child
列表。在数据库中,我有两个表,一个用于Parent
,另一个用于Child
。 Child
表中的每个条目都有一个值parentId
,指向Parent
。
Parent
表:id int
Child
的表:id int,parentId int(外键parent.id)
鉴于Child
ID列表,我想选择具有所有这些子项的每个Parent
(其中可以没有,一个或多个)。有人可以帮我解决问题吗?
更新:
我的例子没有涵盖我的用例 - 抱歉。我需要在Child
中添加另一个字段:我们称之为interestingThing
。以下是表格:
CREATE TABLE Parent (
id INT PRIMARY KEY
);
CREATE TABLE Child (
id INT PRIMARY KEY,
interestingThing INT,
parentId INT,
FOREIGN KEY (parentId) REFERENCES Parent (id)
);
我需要的是找到有孩子的父母,列出我感兴趣的东西。鉴于此数据:
INSERT INTO Parent VALUES (1);
INSERT INTO Parent VALUES (2);
INSERT INTO Child VALUES (1, 42, 1);
INSERT INTO Child VALUES (2, 43, 1);
INSERT INTO Child VALUES (3, 44, 1);
INSERT INTO Child VALUES (4, 8, 2);
INSERT INTO Child VALUES (5, 9, 2);
INSERT INTO Child VALUES (6, 10, 2);
INSERT INTO Child VALUES (7, 8, 1);
我想要一个让这些示例正常工作的查询:
答案 0 :(得分:2)
您可以使用ARRAY_AGG
函数获取interestingThing
的所有parent.id
数组并使用@>
(包含)运算符:
SELECT p.id
FROM parent p
INNER JOIN child c
ON p.id = c.parentId
GROUP BY p.id
HAVING ARRAY_AGG(interestingThing) @> '{8}';
┌────┐
│ id │
├────┤
│ 1 │
│ 2 │
└────┘
(2 rows)
SELECT p.id
FROM parent p
INNER JOIN child c
ON p.id = c.parentId
GROUP BY p.id
HAVING ARRAY_AGG(interestingThing) @> '{8,10}';
┌────┐
│ id │
├────┤
│ 2 │
└────┘
(1 row)
答案 1 :(得分:0)
你可以用这样的东西做到这一点
select parentId
from Child
where id in ( /* your list */ )
group by parentId
having count(distinct id) = /* your list's length */
只有父母的子女数量等于您的名单,只考虑所需的孩子,每个孩子只考虑一次。