Select parents 用于 parent 的 children 中的有趣属性列表
Select parents for a list of interesting properties in the parent's children
我对标题感到困惑,但让我解释一下:
假设我有两个数据结构:Parent
和 Child
。在我的 (Scala) 代码中,每个 Parent
实例都有一个 Child
的列表。在数据库中,我有两个 table,一个用于 Parent
,一个用于 Child
。 Child
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);
我想要一个使这些示例起作用的查询:
- 鉴于有趣的事情 (42, 43),我想找到 ID 为 1 的 parent。
- 鉴于有趣的事情 (43, 44),我想找到 ID 为 1 的 parent。
- 鉴于有趣的事情 (8),我想找到 ID 为 1 的 parent 和 ID 为 2 的 parent。
- 鉴于有趣的事情 (8, 10),我想找到 ID 为 2 的 parent。
你可以用这样的东西来做到这一点
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)
我对标题感到困惑,但让我解释一下:
假设我有两个数据结构:Parent
和 Child
。在我的 (Scala) 代码中,每个 Parent
实例都有一个 Child
的列表。在数据库中,我有两个 table,一个用于 Parent
,一个用于 Child
。 Child
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);
我想要一个使这些示例起作用的查询:
- 鉴于有趣的事情 (42, 43),我想找到 ID 为 1 的 parent。
- 鉴于有趣的事情 (43, 44),我想找到 ID 为 1 的 parent。
- 鉴于有趣的事情 (8),我想找到 ID 为 1 的 parent 和 ID 为 2 的 parent。
- 鉴于有趣的事情 (8, 10),我想找到 ID 为 2 的 parent。
你可以用这样的东西来做到这一点
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)