使用 SQL Where Exists() 过滤结果
Posted
技术标签:
【中文标题】使用 SQL Where Exists() 过滤结果【英文标题】:Filtering results using SQL Where Exists() 【发布时间】:2022-01-03 01:56:14 【问题描述】:我使用的软件仅允许我输入 SQL 语句的 WHERE... 部分。
所以我可以在where子句中使用EXISTS()语句...
然而,
这个查询...
SELECT DISTINCT Left([PR].[WBS1],5)&"-000" AS WBS1
FROM PR
GROUP BY Left([PR].[WBS1],5), Right([PR].[WBS1],3), PR.Status
HAVING ((Right(PR.WBS1,3)<>'000') And ((PR.Status)='A') And (Count(PR.Org))>1)
...返回 78 条记录。
还是
与 WHERE EXISTS... 的查询几乎相同
SELECT PR.WBS1 FROM PR WHERE EXISTS (
SELECT DISTINCT Left([PR].[WBS1],5)&"-000" AS WBS1
FROM PR
GROUP BY Left([PR].[WBS1],5), Right([PR].[WBS1],3), PR.Status
HAVING ((Right(PR.WBS1,3)<>'000') And ((PR.Status)='A') And (Count(PR.Org))>1)
)
...返回所有 31,114 条记录。
我真的不明白为什么。
我做错了什么;有人可以向我解释一下吗?
编辑:我可以在这里放什么来返回相同的 78 条记录:
SELECT * FROM PR WHERE (
?
)
我使用的会计软件只允许我编辑“位置”部分。
【问题讨论】:
【参考方案1】:如果括号内的子查询返回至少 1 行,则EXISTS
返回 TRUE
,如果子查询未返回任何行,则返回 FALSE
。
在您的情况下,子查询返回 78 行,因此 EXISTS
返回 TRUE
。
所以你的第二个查询相当于:
SELECT PR.WBS1 FROM PR WHERE 1=1 -- any boolean expression that returns TRUE
或者简单地说:
SELECT PR.WBS1 FROM PR
【讨论】:
以上是关于使用 SQL Where Exists() 过滤结果的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Kibana/ELK 中进行“where not exists”类型过滤?