4

我为标题而苦苦挣扎,但让我解释一下:

假设我有两个数据结构:ParentChild. 在我的(Scala)代码中,每个Parent实例都有一个Child's 列表。在数据库中,我有两张表,一张 forParent和一张 for Child。表中的每个条目Child都有一个parentId指向它的值Parent

Parent:id int
Child:id int,parentId int(外键 parent.id)

给定一个ChildID 列表,我想选择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);

我想要一个使这些示例正常工作的查询:

  • 鉴于有趣的事情 (42, 43),我想找到 id 为 1 的父级。
  • 鉴于有趣的事情 (43, 44),我想找到 id 为 1 的父级。
  • 鉴于有趣的事情 (8),我想找到 id 为 1 的父级和 id 为 2 的父级。
  • 鉴于有趣的事情 (8, 10),我想找到 id 为 2 的父母。
4

2 回答 2

2

您可以使用该ARRAY_AGG函数获取所有interestingThingfor a的数组parent.id并使用@>(contains) 运算符:

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)
于 2017-04-12T11:59:10.073 回答
0

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

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

您将只获得与您的列表长度相等的孩子数量的父母,只考虑所需的孩子,并且每个孩子只考虑一次。

于 2017-04-12T11:17:19.927 回答