(可能是重复的,但我只能通过 JOIN 找到问题和解决方案,[3]
这不是一个选项。)
我有两张桌子。非常薄(几列)和非常长(多行)。一个是数据表 ( articles
),一个是 ACL 表 ( acl
)。
我只想显示我可以通过 访问的文章acl.some_id
。哪个子查询更快?
[1]
SELECT a.title
FROM articles a
WHERE 0 < (
SELECT COUNT(1)
FROM acl
WHERE article_id = a.id AND some_id IN (1, 2, 3)
)
或者
[2]
SELECT a.title
FROM articles a
WHERE a.id IN (
SELECT article_id
FROM acl WHERE some_id IN (1, 2, 3)
)
我会说第二个,因为该子查询可以重复用于所有可能匹配的行,所以只会执行一次(尽管结果集会非常大),而第一个中的子查询将不得不检查每一个可能匹配行。
还有第三种方法,但这不是一个选项,因为它会重复行(并且 GROUP BY 不是解决方案,因为我以后需要一个 COUNT 来做其他事情(并且 DISTINCT 永远不是解决方案!)):
[3]
SELECT a.title
FROM articles a
JOIN acl
ON acl.article_id = a.id
WHERE acl.some_id IN (1, 2, 3)
由于 article_id X 在 中存在 N 次acl
,它将返回该行 0 - N 次而不是 0 - 1。
还有第四种方式:EXISTS
. 感谢超立方体。
有关的: