Выберите несвязанные столбцы из двух несвязанных таблиц
-
20-12-2019 - |
Вопрос
Есть ли простой способ выбрать два столбца из двух несвязанных таблиц, чтобы использовать эти столбцы во вставке?
Оговорка:В идеале мне никогда не пришлось бы этого делать, потому что схема была бы настроена с помощью чего-то небольшого, называемого "внешними ключами" и "ссылочной целостностью".Но, похоже, ни одна из этих концепций не существовала на планете, на которой была создана эта схема.
Вот упрощенная версия того, что мне нужно сделать:
Стол для клиентов
Id Name
------------
1 Eddie
2 Stone
3 Mike
Таблица продуктов
Id Name
---------------------
100 Drum sticks
101 Guitar strings
102 Amplifier
Таблица счетов-фактур
Id CustomerName ProductName
---------------------------------------
1000 Eddie Guitar Strings
1001 Mike Amplifier
В моем SQL-коде у меня есть :CustomerId
и в :ProductId
, и в идеале я бы хотел сделать что-то вроде этого:
INSERT Invoice (
Id,
CustomerName,
ProductName
)
SELECT
:InvoiceId,
Customer.Name,
Product.Name
FROM
Customer,
Product
WHERE
Customer.CustomerId = :CustomerId
and Product.ProductId = :ProductId
Это работает нормально и денди, если существуют записи как о клиенте, так и о продукте, но мне нужно также учитывать сценарий, в котором один из них не существовать.(Да, действительно.)
Единственный способ, которым я могу это сделать, - это объявить переменные типа :CustomerName
и :ProductName
и предварительно заполняя их вне инструкции insert.
Есть ли способ достичь этого, не прибегая к использованию дополнительных переменных?
Решение
Ты мог бы сделать это:
INSERT Invoice (
Id,
CustomerName,
ProductName
)
SELECT
:InvoiceId,
(
SELECT
Customer.Name
FROM
Customer
WHERE
Customer.CustomerId = :CustomerId
),
(
SELECT
Product.Name
FROM
Product
WHERE
Product.ProductId = :ProductId
)
FROM RDB$DATABASE
Другие советы
Рядом с ответом, предоставленным Arion, вы могли бы использовать FULL OUTER JOIN
с условием соединения, которое всегда истинно.Это работает корректно только в том случае, если оба подзапроса выдают одну строку.
SELECT
:InvoiceId,
CustomerName,
ProductName
FROM (
SELECT CustomerName
FROM Customer
WHERE CustomerId = :CustomerId
) a
FULL OUTER JOIN (
SELECT ProductName
FROM Product
WHERE Product.ProductId = :ProductId
) b
ON 1 = 1