【发布时间】:2015-03-03 08:08:14
【问题描述】:
以下是示例的简化表格:
这是我的查询:
从文章 A 中选择 *
A.id 在哪里(
从文章 A1、article_tag AT 中选择 AT.article_id
在哪里(A1.id = AT.article_id)
AND (AT.tag_id IN (2,1))
按 AT.article_id 分组
HAVING count(AT.article_id) = 2
);
从技术上讲,这个查询似乎确实有效并返回 "all the articles having at least keywords 2 and 1"。
粗体部分是为了改变。例如,如果我的关键字列表是 [1, 3, 4],
(2, 1) 将更改为 (1, 3, 4),2 将更改为 3(列表长度)。
虽然这个查询确实有效,但我稍微记得有个朋友使用 NOT EXISTS 子句。适用吗?如果是,哪个查询在性能方面是最好的优化?
【问题讨论】:
-
子查询中不同的计数!
-
EXISTS 或多或少与 IN 相同,至少在(大多数)dbms 优化之后。 (NOT EXISTS 是 NOT IN 的“空安全”替代方案。)
-
您也可以在子查询中的两个条件上应用联接,但相同的只是让您在查看时清楚。
标签: sql optimization