sql – 选择父项以获取父项子项中有趣属性的列表

我在争夺冠军头衔,但让我解释一下:

假设我有两个数据结构: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)
点赞