SQL列表中缺少哪些值?

时间:2012-07-16 19:11:47

标签: mysql sql

我有一个值列表,比如1,2,3,4,5,6。我有一个SQL表,其中一个字段存储这些值,但只有三行,比如2,4,5。哪种查询会为我返回三行1,3,6? (将所有六个存储在另一个表中并且左连接是作弊。)

5 个答案:

答案 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)