似乎比较运算符修饰符ALL无法按预期工作。我使用的是Microsoft SQL Server 2008 R2 Management Studio(v10.50.4000.0)。
declare @AllTest table
(
ID int identity,
Crew int,
Iteration int,
Value varchar(200)
)
insert @AllTest
values
(1, 1, 'a'),
(2, 1, 'b'),
(3, 1, NULL),
(1, 2, 'd'),
(1, 3, 'e'),
(3, 2, NULL),
(2, 2, 'a'),
(2, 3, 'b'),
(1, 4, NULL),
(1, 5, 'f')
select
*
from
@AllTest
where
1 = 1
and Crew = 1
and Value is not NULL
select
*
from
@AllTest
where
1 = 1
and Crew = 1
and Value is not NULL
and Iteration = all(select v from (values (1),(2),(3)) as t(v))
select
*
from
@AllTest
where
1 = 1
and Crew = 1
and Value is not NULL
and Iteration != all(select v from (values (1),(2),(3)) as t(v))
'Iteration = all'的查询不会返回任何结果但应该返回。 'Iteration!= all'的查询按预期工作。 (但似乎这样的结果更容易通过'迭代不在'而不需要使用像表值构造函数或联合来表示值的子查询来实现。)
无论如何,看起来真的很奇怪ALL并不像所示的那样工作,并且一个简单的表达,例如'Iteration = all(1,2,3)'或'Iteration!= all(1,2,3)'是无效!
select
*
from
@AllTest
where
1 = 1
and Crew = 1
and Value is not NULL
and Iteration != all(1,2,3)
这是我的SQL Server版本的问题还是我错过了什么?
如果ALL不起作用,那么构造查询以表现并返回应该使用ALL生成的结果的最佳替代方法是什么?
编辑: 对于没有就预期结果提出更清楚的问题,我深表歉意。我正在寻找一种方法,只有当Value NULL和Iteration等于1且没有丢失行的行时返回结果。
我希望这是有道理的。
另外,我看到'Iteration = all'是如何寻找单行的,我已经尝试了'Iteration in all',这在语义上更有意义,但它被认为是不正确的语法。
答案 0 :(得分:1)
Iteration = all(select v from (values (1),(2),(3)) as t(v))
装置
Iteration = 1 AND Iteration = 2 AND Iteration = 3
WHERE
一次操作一行。对于任何一行,上述情况都不可能成立 - 因此没有结果。
在您的编辑后,获得所需行为的一种方法是
;WITH CTE
AS (SELECT *
FROM @AllTest
WHERE Crew = 1
AND Value IS NOT NULL)
SELECT *
FROM CTE
WHERE NOT EXISTS (SELECT v
FROM (VALUES (1),
(2),
(3)) AS t(v)
EXCEPT
SELECT c2.Iteration
FROM cte c2)
答案 1 :(得分:0)
我认为你想使用Any而不是ALL。所有适用于>和&lt ;,例如:
select
*
from @AllTest
where 1 = 1
and Crew = 1
and Value is not NULL
and Iteration > all(select v from (values (1),(2),(3)) as t(v))
使用f。
返回记录ID Crew Iteration Value
10 1 5 f
这是Any:
select
*
from @AllTest
where 1 = 1
and Crew = 1
and Value is not NULL
and Iteration = Any(select v from (values (1),(2),(3)) as t(v))
ID Crew Iteration Value
1 1 1 a
4 1 2 d
5 1 3 e