我有一个表System
,其中有一堆字段,其中包括System.serial
。
我有一个要获取其状态的序列号列表。
足够简单:
Select * from System where System.serial in ('s1','s2', 'sn');
但是,序列号列表中的序列也不在System
表中。
显然,它们不在结果中。
我希望缺失的序列也显示在结果中,但是没有数据。
我想到的最好的方法是创建一个包含一列serial
的临时表,然后在其上保留连接System
。
如何不创建临时表?
类似的东西:
Select listOfSerials.serial, System.*
from (Select ('s1','s2', 'sn') as serial ) as ListOfSerials
left join System on System.serial = ListOfSerials.serial;
谢谢, 瑞安
答案 0 :(得分:1)
您在创建虚拟表以对实际数据进行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中定义列别名。其余的都需要使用该列别名。
答案 1 :(得分:0)
创建参考表以存储serial
的列表可能是您的最佳选择。这样您就可以编写类似以下的查询:
SELECT r.serial reference_serial, s.serial system_serial
FROM reference_table r
LEFT JOIN system_table s ON s.serial = r.serial
在使用LEFT JOIN
的情况下,在参考表中声明的serial
在系统表中不可用,会将第二列设置为NULL
。
一种快速而肮脏的解决方法是使用UNION
ed子查询来模拟参考表:
SELECT r.serial reference_serial, s.serial system_serial
FROM (
SELECT 'serial1' AS serial
UNION ALL SELECT 'serial2'
UNION ALL SELECT 'serial2'
...
) r
LEFT JOIN system_table s ON s.serial = r.serial