我有一个值列表,比如1,2,3,4,5,6
。我有一个SQL表,其中一个字段存储这些值,但只有三行,比如2,4,5
。哪种查询会为我返回三行1,3,6
? (将所有六个存储在另一个表中并且左连接是作弊。)
答案 0 :(得分:5)
您没有说明您的DBMS,因此这是ANSI SQL版本:
with the_values (id) as (
values (1),(2),(3),(4),(5),(6)
)
select v.id
from the_values v
left join the_real_table t on t.id = v.id
where t.id is null;
答案 1 :(得分:3)
您也可以尝试使用EXCEPT(类似于Oracle中的MINUS):
(SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
UNION
SELECT 6)
EXCEPT
(SELECT 2
UNION
SELECT 3
UNION
SELECT 4)
或者,与您的示例更相关:
(SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
UNION
SELECT 6)
EXCEPT
(SELECT Field FROM Table)
其中Field包含2,4和5。
答案 2 :(得分:1)
not in
运算符将执行您想要的检查。
declare @allValues table (value int)
insert @allValues values (1)
insert @allValues values (2)
insert @allValues values (3)
insert @allValues values (4)
insert @allValues values (5)
insert @allValues values (6)
declare @someValues table (value int)
insert @someValues values (2)
insert @someValues values (4)
insert @someValues values (5)
select
*
from
@allValues
where
value not in (select value from @someValues)
使用连接可能更快的另一种方法:
select
av.value
from
@allValues av
left join @someValues sv on (av.value = sv.value)
where
sv.value is null
答案 3 :(得分:0)
如果它能胜任,那就不是作弊。设置包含所有可能行的临时表或表变量,然后使用WHERE NOT EXISTS或LEFT OUTER JOIN结合WHERE TableVariableID IS NULL。
答案 4 :(得分:-1)
您可以使用NOT IN
子句。
SELECT column FROM table WHERE column NOT IN (2,4,5)