我有一个表,System
,其中有一堆字段,包括 System.serial
。
我有一个序列号列表,我想获取其状态。
足够简单:
Select * from System where System.serial in ('s1','s2', 'sn');
然而,序列号列表也有不在 System
表中的序列号。
显然它们不在结果中。
我希望丢失的连续出版物也显示在结果中,但没有数据。
我能想到的最好的方法是制作一个包含一列的临时表,serial
,然后 left join System
就可以了。
如何不创建临时表来做到这一点?
类似于:
Select listOfSerials.serial, System.*
from (Select ('s1','s2', 'sn') as serial ) as ListOfSerials
left join System on System.serial = ListOfSerials.serial;
谢谢, 瑞安
最佳答案
您的解决方案是正确的,即创建一个虚拟表,用于对您的真实数据进行 LEFT JOIN。
您可以将派生表创建为一系列 UNIONed SELECT 语句,这些语句选择没有表引用的文字值。
SELECT listOfSerials.serial, System.*
FROM (
SELECT 's1' AS serial
UNION SELECT 's2'
UNION SELECT 'sn'
) AS ListOfSerials
LEFT JOIN System ON System.serial = ListOfSerials.serial;
只需要在UNION中的第一个SELECT中定义一个列别名即可。其余部分需要使用该列别名。
关于mysql 根据 select 中的值创建命名表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55291263/