我们假设以下情况:
表A
id | value
----------
1 | red
2 | orange
5 | yellow
10 | green
11 | blue
12 | indigo
20 | violet
我有一个 id 列表 (
10, 11, 12, 13, 14
),可用于在此表中查找 id。 这个 ID 列表是在我的前端生成的。
使用纯 SQL,我需要从此列表 (
10, 11, 12, 13, 14
) 中选择表 A 中没有条目的 id(加入“id”列)。 结果应该是 id 的 13
和 14
的结果集。
如何仅使用 SQL 来完成此任务? (另外,如果可能的话,我想避免使用存储过程)
我能想到的唯一方法是动态创建一个内联 SQL 表来临时保存我的 id 列表。 但是,我不知道该怎么做。 这可能吗? 有更好的办法吗?
谢谢! :)
从 SQL Server 2008 开始,您可以使用表值构造函数来执行此操作。
SELECT * FROM (
VALUES(1, 'red'),
(2, 'orange'),
(5, 'yellow'),
(10, 'green'),
(11, 'blue'),
(12, 'indigo'),
(20, 'violet'))
AS Colors(Id, Value)
更多信息请点击这里: 表值构造函数
编辑:现在 MySql 从 v8.0 开始支持此功能,语法如下
SELECT a.column_0 x, a.column_1 y, a.column_2 description
FROM
(VALUES
ROW(1, 2, "one and two"),
ROW(3, 4, "three and four")) a;
UNION
子查询创建“内联表”:
(
SELECT 10 AS id
UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14
-- etc.
) AS inline_table
CREATE TEMPORARY TABLE ids (id INT NOT NULL PRIMARY KEY);
INSERT
INTO ids
VALUES
(10),
(11),
(12),
(13),
(14);
SELECT *
FROM ids
WHERE id NOT IN
(
SELECT id
FROM a
);
这样的东西也可以工作
SELECT * FROM (
SELECT 'ds' AS source
UNION ALL
SELECT 'cache' AS source
) as dataSource
----------
| source |
----------
| ds |
----------
| cache |
----------
create table B (id int)
insert into B values (10),(11),(12),(13),(14)
select *
from B
left join A
on A.id=B.id
where A.id is null
drop table B