Выберите несвязанные столбцы из двух несвязанных таблиц

StackOverflow https://stackoverflow.com//questions/25009499

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top