45

让我们假设以下内容:

表 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”列)。结果应该是 id13和的结果集14

如何仅使用 SQL 完成此操作?(另外,如果可能的话,我想避免使用存储过程)

我能想到的唯一方法是动态创建一个内联 SQL 表来临时保存我的 id 列表。但是,我不知道该怎么做。这可能吗?有没有更好的办法?

谢谢!:)

4

5 回答 5

88

您可以使用表值构造函数从 SQL Server 2008 开始执行此操作。

SELECT * FROM (
   VALUES(1, 'red'),
         (2, 'orange'),
         (5, 'yellow'),
         (10, 'green'),
         (11, 'blue'),
         (12, 'indigo'),
         (20, 'violet'))
   AS Colors(Id, Value)

此处的更多信息: 表值构造函数

于 2014-09-15T07:06:48.057 回答
31

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
于 2012-05-22T20:15:26.673 回答
8
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
        );
于 2012-05-22T20:16:20.090 回答
0

像这样的东西也会起作用

    
    SELECT * FROM (
    SELECT 'ds' AS source
    UNION ALL
    SELECT 'cache' AS source
    ) as dataSource
----------
| source |
----------
| ds     |
----------
| cache  |
----------



于 2021-06-17T00:11:14.967 回答
-1
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

http://sqlfiddle.com/#!6/6666c1/30

于 2014-03-13T23:40:01.720 回答