选取父级列表中有趣属性的子级作为父级。

4

我在标题上有些困惑,但让我解释一下:

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

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

给定Child ID列表,我想选择每个Parent(可以没有,一个或多个),这些Parent具有所有这些Child。谁能帮我查询?

更新:

我的示例未涵盖我的用例 - 抱歉。我需要在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的父级。

2
请添加一些示例表数据和预期结果,以格式良好的文本形式展示。同时展示您当前的查询尝试,并标记您正在使用的数据库管理系统。 - jarlh
谢谢。我会做的。 - L42
2个回答

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)

1
太棒了!谢谢 :) - L42

0
你可以使用类似这样的东西来实现。
select  parentId
from    Child
where   id in ( /* your list */ )
group by parentId
having  count(distinct id) = /* your list's length */

您将仅获取具有子项计数等于您列表长度的父项,仅考虑所需的子项,并且每个子项仅出现一次。


谢谢您的回答!您是指在这里使用 where parentId in (my list) 吗?另外,我该如何修改它以允许父级拥有更多不在我的列表中的子级? - L42
不,我的意思是我写的那个 :) 我会考虑一个解决你所描述的变化的方案。 - Stefano Zanini
谢谢。不过请看我的更新后的问题,因为我的第一个问题没有涵盖到我的使用情况。 - L42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接