Select parents 用于 parent 的 children 中的有趣属性列表

Select parents for a list of interesting properties in the parent's children

我对标题感到困惑,但让我解释一下:

假设我有两个数据结构:ParentChild。在我的 (Scala) 代码中,每个 Parent 实例都有一个 Child 的列表。在数据库中,我有两个 table,一个用于 Parent,一个用于 ChildChild table 中的每个条目都有一个指向其 Parent.

的值 parentId

Table 对于 Parent: id int
Table for Child: id int, parentId int (外键 parent.id)

给定 Child 个 ID 列表,我想 select 每个 Parent(其中可以有 none 个或多个)具有所有这些children。有人可以帮我查询一下吗?

更新:

我的示例没有涵盖我的用例 - 抱歉。我需要在 Child 中添加另一个字段:我们称之为 interestingThing。这是 tables:

CREATE TABLE Parent (
  id                INT PRIMARY KEY
);
CREATE TABLE Child (
  id                INT PRIMARY KEY,
  interestingThing  INT,
  parentId          INT,
  FOREIGN KEY (parentId) REFERENCES Parent (id)
);

我需要的是找到 parent 有 children 我的有趣事物列表。鉴于此数据:

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);

我想要一个使这些示例起作用的查询:

你可以用这样的东西来做到这一点

select  parentId
from    Child
where   id in ( /* your list */ )
group by parentId
having  count(distinct id) = /* your list's length */

您将只获得计数为 children 且等于列表长度的 parents,只考虑所需的 children,并且每个只计算一次。

您可以使用 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)