选择父项以获取父项子项中有趣属性的列表

时间:2017-04-12 11:15:12

标签: sql postgresql scalikejdbc

我在争夺冠军头衔,但让我解释一下:

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

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

鉴于Child ID列表,我想选择具有所有这些子项的每个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的父母。

2 个答案:

答案 0 :(得分:2)

您可以使用ARRAY_AGG函数获取interestingThing的所有parent.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)
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 :(得分:0)

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

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

只有父母的子女数量等于您的名单,只考虑所需的孩子,每个孩子只考虑一次。