【问题标题】:SQL efficiently check if an association exists?SQL有效地检查关联是否存在?
【发布时间】:2010-11-05 16:40:05
【问题描述】:

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

我正在使用此查询来返回列表中的所有笔记以及每个笔记的子笔记数。

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

【问题讨论】:

    标签: sql android sqlite


    【解决方案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那个案例。

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 2017-12-10
      • 2012-08-02
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多