我有一个值列表,比如说1,2,3,4,5,6
。我有一个 SQL 表格,其中一个字段存储了这些值,但仅有三行,即2,4,5
。什么样的查询语句会为我返回三行1,3,6
?(把所有六个值存储在另一个表格中并进行左连接是欺骗行为。)
您没有说明您使用的数据库管理系统,因此这是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;
SELECT - UNION
结构,如果您将其写出来,那么更容易在该结构上使用 JOIN
而不使用 WITH
。听起来 WITH
是 SQL'99 的标准。https://dev59.com/U3RC5IYBdhLWcg3wW_pk - chx(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)
其中字段包含2、4和5。
SELECT missing.1 AS missing FROM test RIGHT JOIN (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6) x ON x.1 = test.foo WHERE foo IS NULL;
- chxvalues
行构造函数的数据库,可以缩短为values (1),(2),(3),(4),(5),(6) EXCEPT SELECT col FROM foo
。 - user330315SELECT missing.1 AS missing FROM test RIGHT JOIN (values (1),(2),(3),(4),(5),(6))...
在那里能行吗? - chxUnknown column 'missing.1' in 'field list'
的错误提示。 - knoctenot 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
使用Mysql 8,您可以使用JSON_TABLE并从JSON值数组中选择表
SELECT *
FROM
JSON_TABLE(
'[1,2,3,4,5,6]',
'$[*]' COLUMNS( id INT PATH '$' ERROR ON ERROR )
) as v
left join the_real_table t on t.id = v.id
where t.id is null;
如果它完成了工作,那么就不算作弊。设置一个临时表或包含所有可能行的表变量,然后使用WHERE NOT EXISTS或LEFT OUTER JOIN与WHERE TableVariableID IS NULL相结合。
NOT IN
子句。SELECT column FROM table WHERE column NOT IN (2,4,5)
NOT IN()
子句这样吗? - Jeremy Holovacs