动态创建内联SQL表(用于排除左连接)

rin*_*ogo 30 mysql sql rdbms

我们假设如下:

表A.

id | value
----------
1   | red
2   | orange
5   | yellow
10  | green
11  | blue
12  | indigo
20  | violet
Run Code Online (Sandbox Code Playgroud)

我有一个id(10,11,12,13,14)列表,可用于在此表中查找id.这个id列表是在我的前端生成的.

使用纯SQL,我需要从表A中没有条目的列表(10,11,12,13,14)中选择id(加入'id'列).结果应该是id 13和14的结果集.

如何仅使用SQL来实现此目的?(另外,如果可能的话,我想避免使用存储过程)

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

谢谢!:)

phi*_*yle 59

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

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

更多信息: 表值构造函数

  • 幸运的是,我仍然点击它,发现了这一点 (16认同)
  • 不幸的是,这个问题用`mysql`标记,而不是`sql-server`. (6认同)
  • 由于我正在搜索SQL Server,并且因为您提供了技术/功能/功能的名称,因此提出了反对,即使OP要求另一个RDBMS。 (3认同)

egg*_*yal 26

您可以使用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
Run Code Online (Sandbox Code Playgroud)

  • @rinogo:对于非常大的列表,你可以点击`max_allowed_pa​​cket`限制,这不允许你提交查询,尽管它需要数十万条带有默认设置的记录. (2认同)

Qua*_*noi 7

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
        );
Run Code Online (Sandbox Code Playgroud)

  • @mortezakavakebi:来自文档:*一个`TEMPORARY`表只对当前连接可见,并在连接关闭时自动删除.这意味着两个不同的连接可以使用相同的临时表名,而不会相互冲突或与现有的同名非`TEMPORARY`表冲突.* (4认同)