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

问题描述 投票:0回答:5

我们假设以下情况:

表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 列表。 但是,我不知道该怎么做。 这可能吗? 有更好的办法吗?

谢谢! :)

mysql sql rdbms
5个回答
117
投票

从 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;

MySql 功能请求


34
投票

您可以使用

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

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
        );

0
投票

这样的东西也可以工作

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




-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

© www.soinside.com 2019 - 2024. All rights reserved.