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

Mysql 动态创建内联SQL表(用于排除左联接),mysql,sql,rdbms,Mysql,Sql,Rdbms,让我们假设如下: 表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的结果集 仅使

让我们假设如下:

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

谢谢!:)

您可以使用子查询创建“内联表”:

(
            SELECT 10 AS id
  UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14
  -- etc.
) AS inline_table

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

SELECT * FROM (
   VALUES(1, 'red'),
         (2, 'orange'),
         (5, 'yellow'),
         (10, 'green'),
         (11, 'blue'),
         (12, 'indigo'),
         (20, 'violet'))
   AS Colors(Id, Value)
更多信息请点击此处:

这不是很清楚。如果您的ID不在另一个表中,则没有要加入的内容。确切地说:)这就是问题所在!
不在()
有什么问题?@Cfreak:OP不希望表中的id不在列表中;他想要列表中不在表中的id。如果我的列表实际上只有几百个条目(而不是问题中的5个条目),这会有问题吗?@rinogo:这会让你的查询很长(这可能意味着需要一段时间来解析),但是我没有意识到任何可能导致的内在问题。@rinogo:对于非常大的列表,您可以达到
max\u allowed\u packet
限制,这将不允许您提交查询,尽管它需要数十万条默认设置的记录。这正是我所需要的!PS:我对条目数量的需求非常有限:从0到6,所以这个结果相当不错well@mortezakavakebi:什么意思?创建表不是会话基础。当不同用户调用包含此查询的url时,会在“ids”表上产生冲突。@mortezakavakebi:从文档中:一个
临时
表仅对当前连接可见,并在连接关闭时自动删除。这意味着两个不同的连接可以使用相同的临时表名,而不会相互冲突,也不会与相同名称的现有非
临时
表冲突;下面是消息:在CREATE、DROP或ALTER语句中使用了未知的对象类型“临时”。@FrenkyB:当您尝试在SQL Server上运行MySQL查询时,这是正常的。不幸的是,此问题被标记为
MySQL
,不是
sql server
。幸运的是,我仍然单击了它并找到了它,因为我正在搜索sql server,并且因为您提供了技术/功能/功能的名称,即使OP要求另一个RDBMS。
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
SELECT * FROM (
   VALUES(1, 'red'),
         (2, 'orange'),
         (5, 'yellow'),
         (10, 'green'),
         (11, 'blue'),
         (12, 'indigo'),
         (20, 'violet'))
   AS Colors(Id, Value)