gpt4 book ai didi

sql - IN vs NOT EXISTS 子句,查询优化

转载 作者:行者123 更新时间:2023-12-03 17:22:43 26 4
gpt4 key购买 nike

以下是示例的简化表:
my tables
这是我的查询:

SELECT * FROM article A

WHERE A.id IN (

   SELECT AT.article_id FROM article A1, article_tag AT

   WHERE (A1.id = AT.article_id)

   AND (AT.tag_id IN (2,1))

   GROUP BY 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 (列表的长度)。
虽然这个查询确实有效,但我稍微记得一个 friend 使用 不存在 条款。适用吗?如果是,就性能而言,哪个查询是最佳优化?

最佳答案

您不需要 EXISTS 或 IN - 只需 GROUP BY文章中的所有专栏,您就完成了。示例(在 Oracle 语法中,因为您没有提及您的 RDBMS):

with article(id, title) as (
select 1, 'MS SQL Server' from dual union all
select 2, 'Oracle' from dual union all
select 3, 'PostgreSQL' from dual union all
select 4, 'IDBM DB2' from dual),
article_tag(id, article_id, tag_id) as (
select 1,1,1 from dual union all
select 2,1,2 from dual union all
select 3,2,1 from dual union all
select 4,3,2 from dual
)
SELECT a.id, a.title
FROM article a
JOIN article_tag at ON a.id = at.article_id
AND at.tag_id IN (2,1)
GROUP BY a.id, a.title
HAVING COUNT(at.article_id) = 2;

关于sql - IN vs NOT EXISTS 子句,查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28826873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com