Sql 选择parents可在parent';孩子们

Sql 选择parents可在parent';孩子们,sql,postgresql,scalikejdbc,Sql,Postgresql,Scalikejdbc,我为标题而挣扎,但让我解释一下: 假设我有两个数据结构:Parent和Child。在我的(Scala)代码中,每个父实例都有一个子实例的列表。在数据库中,我有两个表,一个用于Parent,另一个用于Child。Child表中的每个条目都有一个值parentId,该值指向其Parent 父项的表:id int 子项的表:id int,parentId int(外键parent.id) 给定一个子ID的列表,我想选择每个父ID(其中可以没有、一个或多个)包含所有这些子ID。有人能帮我解答这个问题吗

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

假设我有两个数据结构:
Parent
Child
。在我的(Scala)代码中,每个
父实例都有一个
子实例的列表。在数据库中,我有两个表,一个用于
Parent
,另一个用于
Child
Child
表中的每个条目都有一个值
parentId
,该值指向其
Parent

父项的表:id int
子项的表:id int,parentId int(外键parent.id)

给定一个
子ID的列表,我想选择每个
父ID
(其中可以没有、一个或多个)包含所有这些子ID。有人能帮我解答这个问题吗

更新:

我的示例没有涵盖我的用例-对不起。我需要在
Child
中添加另一个字段:让我们称之为
有趣的东西
。以下是表格:

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的家长

你可以用这样的东西来做

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

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

您可以使用
数组\u AGG
函数为
父项.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)


添加一些示例表数据和预期结果,以及格式良好的文本。同时显示您当前的查询尝试。并标记您正在使用的dbms。谢谢。好的。谢谢你的回答!你的意思是
我的列表中parentId在哪里?另外,我如何修改它,使家长可以有更多不在我列表中的孩子?不,我是指我写的:)我会考虑你所描述的改变的解决方案。但请看我更新的问题-我的第一个问题没有涉及我的用例。太棒了!谢谢:)
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)