2010-11-05 60 views
1

我有一個筆記和列表的數據庫,有三個關聯表。 基本上,列表是父母的筆記和其他列表,筆記可以是其他筆記的父母,如層次結構中的大綱。SQL有效地檢查一個關聯是否存在?

我正在使用此查詢來返回列表中的所有筆記以及每個筆記具有的子筆記的數量。

SELECT count(n2.note_id) as Num_Subnotes, _id, title, details 
FROM NOTES 
JOIN NOTES_IN_LISTS n1 ON NOTES._id=n1.note_id 
LEFT JOIN NOTES_IN_NOTES n2 ON NOTES._id=n2.parent_note_id 
WHERE n1.listId=12 
GROUP BY NOTES._id 
COLLATE NOCASE 

這個查詢工作得很好,但它是過度的。我不需要返回count(n2.note_id) as Num_Subnotes,因爲我只使用該值來檢查鈔票是否有任何子注。從本質上講,它是一個布爾值,其中0爲假,> 0爲真。

在我看來,計算所有這些記錄是浪費時間,當我找到第一個匹配值後可以返回1。

是否有更高效的方法來檢查上述查詢中的count(n2.note_id)>0

回答

1
SELECT EXISTS (SELECT 1 FROM NOTES_IN_NOTES n2 WHERE n2.parent_note_id = n0._id) as Has_Subnotes, n0._id, n0.title, n0.details 
FROM NOTES n0 
INNER JOIN NOTES_IN_LISTS n1 ON n0._id = n1.note_id 
WHERE n1.listId = 12 
COLLATE NOCASE 

這已經有一段時間,因爲我使用的SQLite,但關鍵是要利用EXISTS如果支持,與子查詢一起。如果不這樣工作,則可能需要在Has_Subnotes列中使用COALESCE,而對NOTES_IN_NOTES表執行LEFT JOIN,但在此情況下不需要使用GROUP BY