当找不到“WHERE IN(..)”中的一个值时,返回零记录

时间:2015-10-28 12:24:06

标签: sql sql-server

我有一个SQL查询,它执行以下操作:

SELECT * FROM myTable WHERE Id IN (574,575,576,577,578,579,580)

此查询返回它可以使用这七个ID之一找到的所有记录。如果它找不到其中一个ID那么它只会返回较少的记录。

我真正需要的是它要么返回所有记录,要么返回NONE。

因此,如果它找不到IN子句中存在的ID之一,那么它应该返回零记录。

我正在针对视图构建动态查询,因此我只能在WHERE子句后添加自定义查询。

如何在一个查询中执行此操作?

2 个答案:

答案 0 :(得分:1)

这似乎是一个奇怪的要求。但听起来你想要一个非相关的子查询来计算ID:

select t.*
from mytable t
where Id in (574, 575, 576, 577, 578, 579, 580) and
      7 = (select count(distinct id)
           from mytable
           where Id in (574, 575, 576, 577, 578, 579, 580)
          );

您可能实际上不想重复这些值,所以:

with t as (
      select t.*
      from mytable t
      where Id in (574, 575, 576, 577, 578, 579, 580)
    )
select t.*
from t
where 7 = (select count(distinct id) from t);

答案 1 :(得分:0)

如果将值放入表变量

,则可以使用一些花哨的连接
DECLARE @list table(id int)
INSERT @list values(1),(574),(575),(576),(577),(578),(579),(580)
-- remarked row
--INSERT @list values(574),(575),(576),(577),(578),(579),(580)

DECLARE @mytable table(id int)

INSERT @mytable values(574),(575),(576),(577),(578),(579),(580),(581),(592)

SELECT mt.* FROM
  @myTable mt
JOIN @list list on mt.id = list.id
WHERE not exists(SELECT id from @list EXCEPT SELECT id from @myTable)

结果返回0行。

如果您将标记的行用作testdata而不是

,则将返回7行