2009-11-26 55 views
3

比方說,我有如下表:如何在SQL中實現「hasChildren」SELECT語句?

ID | parentID | MoreStuff 
1 | -1  | ... 
2 | 1  | ... 
3 | 1  | ... 
4 | 2  | ... 
5 | 1  | ... 

我怎樣才能生成SQL SELECT語句,以找出是否特定行有孩子嗎?換句話說,我想知道,如果ID 1有孩子,在這種情況下,它具有3

我不知道如何創建SQL語句:

SELECT ID, hasChildren FROM myTable; 

什麼將被替換爲hasChildren在上面的SQL SELECT語句中?

+0

什麼數據庫? Oracle具有可用的LEAD和LAG功能。 – 2009-11-26 21:42:25

回答

15

沒有組版本:

SELECT MyTable.Id, CASE WHEN EXISTS 
    (SELECT TOP 1 1 --you can actually select anything you want here 
    FROM MyTable MyTableCheck 
    WHERE MyTableCheck.ParentId = MyTable.Id 
    ) THEN 1 ELSE 0 END AS HasRows 
FROM MyTable 
+0

+1爲存在,擊敗我吧! :) Op:到目前爲止,這是最有效的,因爲一旦知道子行存在,它就立即返回,這意味着它不必計算所有的子元素。如果你關心的是孩子的存在,這是做到這一點的方法。 – Donnie 2009-11-26 21:22:12

+0

小問題,但你可以寫一點更優雅的WHEN EXISTS(SELECT NULL FROM MyTable ...) – 2009-11-26 21:30:05

+1

頂部1是不需要的,請參閱我上面的評論。反正在第一場比賽中停止。選擇null,1或*沒有實際效果,所有存在關心的是返回的東西。優化器不會實際獲取數據。 – Donnie 2009-11-26 21:33:13

12

加入表上本身找到,如果有孩子:

SELECT 
    parent.id as ID 
, case when count(child.id) > 0 then 1 else 0 end as hasChildren 
FROM  myTable parent 
LEFT JOIN myTable child 
ON   child.parentID = parent.ID 
GROUP BY parent.id 
+0

+1自我加入僅適用於這些查詢... – 2009-11-26 22:19:34

2

如果你知道已經知道父ID,然後查詢方式簡單 - 只需選擇與父ID的行數。

SELECT count(*) FROM myTable where parentID = 1; 
+0

+1是實際回答的唯一查詢,如果「特定行有子女」 – 2009-11-26 22:10:27

+0

您的查詢是查找特定行是否有子女。但是,如何獲得所有具有動態創建的額外列的行的列表,名爲hasChildren? – 2009-11-27 03:41:47

+0

要獲得帶有額外列的所有行的列表,請參閱Alex或Andomar的答案。然而,這個問題明確地要求提出一個問題「要找出一個特定的行是否有孩子」,這就是Kaleb的答案。 – 2009-11-27 11:23:25

2

有非常有效的回答你的問題,這將正常工作。但是,如果數據集非常大,我會考慮這種查詢的性能。

如果您打算使用分組依據或子查詢來獲取數據,請確保ID和父列具有單獨的索引。

爲了獲得更好的性能,您應該添加一個名爲「haschildren」的列,該列可以是「位」數據類型。當項目被插入或刪除時,應該從應用程序代碼更新此列。這將允許您運行更快的查詢:

SELECT * FROM table WHERE haschildren IS NOT NULL 
+0

+1緩存想法 – 2009-11-26 21:27:44

1

上述解決方案都很好,但你不應該添加像「haschildren」列,除非你真的有一個性能問題(見GateKiller後)。這樣的一個列將數據庫非標準化,即同一條信息將被存儲在兩個地方,這使得您的數據更可能變得不一致。無論何時插入新的孩子,刪除現有的孩子或更新孩子的父母,您都必須維護此列。

+0

因爲他要求查詢以指示是否存在子女,所以這不是反規範化任何事情。如果他要更新基準表,那麼它會的,但我不明白他的意思。 – Donnie 2009-11-26 21:39:17

+0

-1同意唐尼 – 2009-11-26 22:20:43

+0

+1 - 這些都是有效的擔憂,無論是否在技術上去標準化。 – gkrogers 2009-11-27 06:27:46