質問

インサートの列を使用するには、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
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top