MySQL从选择值创建命名表

时间:2019-03-22 00:41:12

标签: mysql sql

我有一个表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;

谢谢, 瑞安

2 个答案:

答案 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