5

我有一个值列表,比如说1,2,3,4,5,6。我有一个 SQL 表,其中有一个存储这些值的字段,但只有三行,比如2,4,5. 什么样的查询将为我返回三行1,3,6?(将所有六个存储在另一个表中并左加入是作弊。)

4

5 回答 5

7

您没有说明您的 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;
于 2012-07-16T19:16:58.953 回答
4

您也可以尝试使用 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。

于 2012-07-16T19:39:44.347 回答
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
于 2012-07-16T19:15:48.943 回答
0

如果它完成了工作,这不是作弊。设置一个包含所有可能行的临时表或表变量,然后使用 WHERE NOT EXISTS 或 LEFT OUTER JOIN 结合 WHERE TableVariableID IS NULL。

于 2012-07-16T19:16:28.957 回答
-3

你可以使用一个NOT IN子句。

SELECT column FROM table WHERE column NOT IN (2,4,5)
于 2012-07-16T19:15:39.437 回答