【发布时间】:2015-09-09 01:17:03
【问题描述】:
我有一个 id 列表:
(1, 2, 3, 6, 7)
还有一张桌子:
id | anothercolumn
------------------
1 | NULL
2 | foo
4 | bar
5 | NULL
6 | NULL
我想从我的列表中检索不是我的表的 id 的值。
预期结果:
3, 7
不带 FROM 的选择
我尝试过这样的事情:
SELECT i
WHERE i IN (1, 2, 3, 6, 7)
AND i NOT IN (SELECT id FROM mytable);
但这不是一个有效的 MySQL 查询(FROM 是必需的)。
联合
也有这种可能:
SELECT i
FROM (
SELECT 1 AS i
UNION SELECT 2
UNION SELECT 3
UNION SELECT 6
UNION SELECT 7 ) AS mylistofids
LEFT JOIN mytable
ON mytable.id = i
WHERE mytable.id IS NULL;
这行得通,但是如果我的 id 列表变大,查询很快就会变大......
临时表
我还可以为我的 id 列表创建一个临时表:
CREATE TEMPORARY TABLE mylistofids (
i INT
);
INSERT INTO mylistofids (i) VALUES (1), (2), (3), (6), (7);
然后在LEFT JOIN中使用它:
SELECT i
FROM mylistofids
LEFT JOIN mytable
ON mytable.id = i
WHERE mytable.id IS NULL;
这也有效,但就我而言,我无权创建表(临时或非临时)。
您是否找到了以最好的方式解决此问题的方法?
【问题讨论】:
-
如果没有临时表,您可能必须在调用代码中解决它。一旦列表变大,DBMS 将达到 IN 语句的限制。此外 IN 语句不会向结果添加新键,因此 SELECT without FROM(即使使用 FROM)总是会失败。 UNION 版本可以工作,但对于较大的数字会很慢。
标签: mysql