测试行是否存在非常简单。
if exists(select * from dbo.APQP_head where zestaw=@zestaw)
我想在我的查询中测试所有行是否满足条件。
我需要使用像这样的查询
if All exists(select * from dbo.APQP_head where zestaw=@zestaw and type=3)
但这种语法不正确。
答案 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))