获取mysql表中不存在的值

时间:2013-01-01 22:53:13

标签: mysql sql

我有一组值(键),1,2,3,4,5和下表:

id key
------
1  2
2  8
3  4

如果我需要检查db中的哪个给定键,我使用:

SELECT * 
  FROM mytable 
 WHERE key IN (1,2,3,4,5)

所以我得到带有键2和4的行。

是否有某种mysql方法可以找出哪些给定键不在db中?所以在这种情况下,我想得到1,3,5。

3 个答案:

答案 0 :(得分:5)

使用您的密钥创建临时表:

CREATE TEMPORARY TABLE mykeys (`key` INT);
INSERT INTO mykeys VALUES (1),(2),(3),(4),(5);

然后使用NOT IN:

SELECT `key`
FROM mykeys
WHERE `key` NOT IN (SELECT `key` FROM mytable)

最后,如果必须,请删除TEMP表:

DROP TABLE mykeys

编辑:添加了SQLFiddle


如果您正在使用支持EXCEPT operator的PostgreSQL,并且还可以使用VALUES语句从值列表创建行集,则可以使用另一种更简单的方法来执行此操作而无需临时表({ {3}}):

VALUES (1),(2),(3),(4),(5)
EXCEPT
SELECT key FROM mytable

答案 1 :(得分:1)

虽然这是一个非常混乱的解决方案,但确实有效:

select v.val from
(
  select 1 as val
  union
  select 2 as val
  union
  select 3 as val
  union
  select 4 as val
  union
  select 5 as val
) v
WHERE
v.val NOT IN(
  SELECT `key` 
  FROM mytable 
  WHERE key IN (1,2,3,4,5)
);

答案 2 :(得分:1)

这有点笨重,但确实有效:

select sq.val
from   mytable t
       right join (select 1 as val
                   union 
                   select 2
                   union 
                   select 3
                   union 
                   select 4
                   union 
                   select 5 ) as sq
 on t.col = sq.val
 where t.id is null;

Obligatory SQL Fiddle.