2つの無関係のテーブルから無関係な列を選択します
-
20-12-2019 - |
質問
インサートの列を使用するには、2つの無関係なテーブルから2つの列を選択する簡単な方法がありますか?
免責事項:理想的には、スキーマは「外部キー」と「参照整合性」という小さなもので設定されているため、これを行う必要はありません。しかし、このスキーマが作成された惑星にこれらの概念のどちらも存在しないようです。
これは私がする必要があるものの単純化されたバージョンです:
顧客テーブル
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
.
顧客と製品の両方のレコードが存在する場合は、これは細かく、DANDYが機能しますが、それらのうちの1つが存在しないシナリオにも対応する必要があります。 (はい、本当に。)
: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
. 他のヒント
Ariionによって提供された答えの横には、常にtrueの結合条件を持つ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
. 所属していません StackOverflow