使用 EXISTS 的 TSQL 返回的记录多于预期
Posted
技术标签:
【中文标题】使用 EXISTS 的 TSQL 返回的记录多于预期【英文标题】:TSQL using EXISTS returns more records than expected 【发布时间】:2014-06-05 21:29:25 【问题描述】:查询或我对存在应该如何工作的理解有问题。
我想通过 id 返回一个重复的列表来隔离和消除。
查询:
select id
, ref_id
from assets
where exists
(
select ref_id
from assets
where ref_id is not null
group by ref_id
having count(id)>1
)
子查询返回的正是我所期望的,但整个查询返回所有资产记录。我认为它应该只包含在子查询中。
请指教
【问题讨论】:
【参考方案1】:你需要使用exists里面的外部表中的一个字段:
select id
, ref_id
from assets _assets
where exists
(
select ref_id
from assets _existingAssets
where ref_id is not null
and _existingAssets.ref_id = _assets.ref_id
group by ref_id
having count(id)>1
)
您也可以使用in
caluse 来做到这一点:
select id
, ref_id
from assets
where ref_id in
(
select ref_id
from assets
where ref_id is not null
group by ref_id
having count(id)>1
)
【讨论】:
字段ref_id
不在两者中吗?我很确定是的。
这是您缺少的行 and _existingAssets.ref_id = _assets.ref_id
。您需要为存在定义一个关系。
这是exists子句中assets表的表别名。
如果不定义关系,您可以将查询更改为Exists (select 1)
,它会返回相同的结果。在此处查看示例 B:msdn.microsoft.com/en-us/library/ms188336.aspx
我会给你答案,因为in
答案。这就是我一直在寻找的 - 谢谢!如果您必须首先为它做所有这些工作,仍然不确定exists
的意义吗?以上是关于使用 EXISTS 的 TSQL 返回的记录多于预期的主要内容,如果未能解决你的问题,请参考以下文章