使用 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 返回的记录多于预期的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - exists与in的用法

TSQL SELECT TOP(如果标志=真则限制,否则无限)

ORA-01427单行子查询返回多于 1 行

mysql exists 的使用

具有多个 EXISTS 的查询返回太多行

TSQL - 如何从一个结果集中的多个表中加入 1..*?