我在争夺冠军头衔,但让我解释一下:
假设我有两个数据结构:Parent和Child.在我的(Scala)代码中,每个Parent实例都有一个Child列表.在数据库中,我有两个表,一个用于Parent,一个用于Child. Child表中的每个条目都有一个指向其Parent的值parentId.
父表:id int
Child的表:id int,parentId int(外键parent.id)
给定一个子ID列表,我想选择具有所有这些子节点的每个父节点(其中可以没有,一个或多个).有人可以帮我解决问题吗?
更新:
我的例子没有涵盖我的用例 – 抱歉.我需要在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);
我想要一个查询,让这些示例工作:
>鉴于有趣的事情(42,43),我想找到id为1的父母.
>鉴于有趣的事情(43,44),我想找到id为1的父母.
>鉴于有趣的事情(8),我想找到id为1的父级和id为2的父级.
>鉴于有趣的事情(8,10),我想找到id为2的父母.
最佳答案 您可以使用ARRAY_AGG函数获取parent.id的所有interestingThing的数组,并使用@> (包含)运算符:
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)