代码之家  ›  专栏  ›  技术社区  ›  CodeFusionMobile

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

  •  1
  • CodeFusionMobile  · 技术社区  · 14 年前

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

    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为false,>0为true。

    在我看来,计算所有这些记录是浪费时间,因为在找到第一个匹配值后,我只能返回1。

    有没有更有效的方法来检查 count(n2.note_id)>0 在上面的问题中?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Andrew    14 年前
    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 JOIN NOTES_IN_NOTES GROUP BY 那样的话。