测试所有行都存在

时间:2012-02-03 12:07:30

标签: sql exists

测试行是否存在非常简单。

if exists(select * from dbo.APQP_head where zestaw=@zestaw)

我想在我的查询中测试所有行是否满足条件。

我需要使用像这样的查询

if All exists(select * from dbo.APQP_head where zestaw=@zestaw and type=3)

但这种语法不正确。

4 个答案:

答案 0 :(得分:6)

if NOT exists(select * from dbo.APQP_head where zestaw<>@zestaw OR type<>3) 
  --all rows satisfy the condition

如果您的列可以为空,那么

if NOT exists(select * from dbo.APQP_head where zestaw<>@zestaw OR type<>3) 
AND NOT exists(select * from dbo.APQP_head where zestaw IS NULL OR type IS NULL) 

答案 1 :(得分:2)

这可能比OR更好,因为它保持AND并使用半连接

IF NOT EXISTS (
   SELECT zestaw, [type] FROM #foo
   EXCEPT
   SELECT zestaw, [type] FROM #foo where zestaw=@zestaw and type=3
   )
  -- all rows etc

编辑,快速和脏测试(工作站上的SQL Server 2008 R2 Express),EXCEPT使用更多IO(2次触摸)但CPU更少(更有效的计划)

如果用常量替换@zestaw,则NOT EXISTS ..或..赢得

CREATE TABLE excepttest (zestaw int, [type] int);
INSERT excepttest VALUES (1, 3);
GO
INSERT excepttest SELECT excepttest.* FROM excepttest
GO 21
SELECT COUNT(*) FROM excepttest
GO
CREATE INDEX IX_Test ON excepttest (zestaw, [type]);
GO

DECLARE @zestaw int = 1;
SET STATISTICS IO ON
SET STATISTICS TIME ON
if NOT exists(select * from excepttest where zestaw<>@zestaw OR [type]<>3) 
   SELECT 'all match'
ELSE
   SELECT 'some match';

IF NOT EXISTS (
        SELECT zestaw, [type] FROm excepttest
        EXCEPT
        SELECT zestaw, [type] FROm excepttest where zestaw=@zestaw and [type]=3
        )
   SELECT 'all match'
ELSE
   SELECT 'some match';

SET STATISTICS IO OFF
SET STATISTICS TIME OFF
DROP TABLE excepttest

答案 2 :(得分:0)

您可以在WHERE子句中反转整个exists表达式中的条件:

if NOT exists select(select * from dbo.APQP_head where zestaw <> @zestaw OR type <> 3)

这使用一个众所周知的事实:NOT(A1和A2 AND ... An)== NOT(A1)OR NOT(A2)......或NOT(An)。

答案 3 :(得分:0)

if not exists(select * from dbo.APQP_head where not (zestaw=@zestaw and type=3))