2017-04-12 167 views
4

我的標題掙扎了名單,但讓我解釋一下:選擇父母有趣的性質在父母的子女

比方說,我有兩個數據結構:ParentChild。在我的(斯卡拉)代碼中,每個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。
  • 鑑於inter esting東西(8,10),我想找到ID爲母公司2.
+2

添加一些示例表數據和預期結果 - 以及格式化文本。同時向我們展示您當前的查詢嘗試。並標記你正在使用的dbms。 – jarlh

+0

謝謝。會做。 – L42

回答

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

太棒了!謝謝 :) – L42

0

你可以做到這一點是這樣的

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

您將得到只有具有計數父母的孩子等於你的名單的長度,只考慮到所需的孩子,每個人只有一次。

+0

謝謝你的回答!你的意思是'在哪裏(我的名單)'parentId?另外,我怎樣才能修改這個,讓父母有更多的孩子不在我的列表中? – L42

+0

不,我的意思是我寫了:)我會考慮爲您描述的更改提供解決方案 –

+0

謝謝。雖然看到我更新的問題 - 我的第一個問題沒有涵蓋我的用例。 – L42