SQL有效地检查是否存在关联?

时间:2010-11-05 16:40:06

标签: sql android sqlite

我有一个笔记和列表数据库,有三个关联表。 基本上,列表是注释和其他列表的父项,注释可以是层次结构等大纲中的其他注释的父项。

我正在使用此查询返回列表中的所有注释以及每个注释所具有的子注释数。

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 个答案:

答案 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,还要使用子查询。如果它不起作用,您可能不得不在COALESCE列中使用Has_Subnotes而是LEFT JOINNOTES_IN_NOTES,但您不会在这种情况下需要使用GROUP BY