mysql Создать именованную таблицу из значений в select - PullRequest
2 голосов
/ 22 марта 2019

У меня есть таблица, 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 ]

1 голос
/ 22 марта 2019

Вы на правильном пути с вашим решением по созданию виртуальной таблицы, с помощью которой можно выполнить левое соединение с вашими реальными данными.

Вы можете создать производную таблицу как серию операторов 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;

Вам нужно только определить псевдоним столбца в первом SELECT в UNION. Остальные должны использовать псевдоним этого столбца.

0 голосов
/ 22 марта 2019

Создание справочной таблицы для хранения списка serial s, вероятно, является лучшим вариантом.Это позволит вам написать запрос, например:

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 s, объявленными в справочной таблице, но недоступными в системной таблице, второй столбец будет иметь значение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...