2

SQLステートメントを作成しようとしていますが、エラーが発生し続けます...

これが私の状況です:

受注のテーブルとアイテムの転送のテーブルがあります。

販売注文には注文番号と内線番号があり、ID自体は一意ではない場合がありますが、注文番号と内線番号の組み合わせは一意です。拡張子はnullにすることができます。

アイテム転送テーブルには、参照番号と、場合によっては販売注文番号と内線番号がありますが、常にそうとは限りません。

その理由は、アイテムが販売注文のために転送される場合もあれば、他の理由で転送される場合もあるためです。また、アイテムが最初に転送されなくても、販売注文が発生する可能性があります。ただし、1つの注文で転送できるのは1つだけであり、その逆も同様です。

必要に応じて、注文を転送に接続できるように、販売注文テーブルにフィールド「transref」を追加しました。(パフォーマンス上の理由から、この情報をオンザフライで計算することはできません。)したがって、私のテーブルは次のようになります(実際には大きくなりますが、これは重要な情報です)。

SALESORDERS
ORDERNO ORDEXT TRANSREF
1       (null) (null)
2       (null) (null)
2       a      (null)
3       (null) (null)

TRANSFERS
TRANSREF ORDERNO ORDEXT 
t1       1       (null)
t2       (null)  (null)
t3       2       a

次に、transrefコードを販売注文テーブルに入れて、次のようにする必要があります。

SALESORDERS
ORDERNO ORDEXT TRANSREF
1       (null) t1
2       (null) (null)
2       a      t3
3       (null) (null)

私はあらゆる種類のステートメントを試しました、例えば

UPDATE SALESORDERS 
INNER JOIN TRANSFERS 
ON SALESORDERS.ORDERNO = TRANSFERS.ORDERNO and (SALESORDERS.ORDEXT = TRANSFERS.ORDEXT or (SALESORDERS.ORDEXT is null and TRANSFERS.ORDEXT is null))
SET SALESORDERS.TRANSREF = TRANSFERS.TRANSREF 
WHERE TRANSFERS.ORDERNO IS NOT NULL

しかし、これまでのところ何も機能しませんでした。誰かが私がこれに対する12のチュートリアルと答えを試した後に私の脳で得た結び目を解くのを手伝ってくれるでしょうか?

4

4 に答える 4

3

AS / 400と何度か呼んでいるので、古いバージョンのオペレーティングシステムを使用していると仮定します。おそらく、相関のある副選択が必要です。何かのようなもの:

update salesorders o
set transref = (select t.transref 
  from transfers t
  where o.orderno = t.orderno
    and (o.ordext = t.ordext or (t.ordext=null and o.ordext=null))
    and t.transref <> null)
where ordext = null;
于 2012-09-26T17:12:28.410 に答える
2

この構文は、SQLの種類に完全に依存します

たとえば、これは機能する可能性があります(SQL Server)

UPDATE SALESORDERS  
SET SALESORDERS.TRANSREF = TRANSFERS.TRANSREF  
FROM
SALESORDERS  
INNER JOIN TRANSFERS  
ON SALESORDERS.ORDERNO = TRANSFERS.ORDERNO and (SALESORDERS.ORDEXT = TRANSFERS.ORDEXT or (SALESORDERS.ORDEXT is null and TRANSFERS.ORDEXT is null)) 
WHERE TRANSFERS.ORDERNO IS NOT NULL 
于 2012-09-26T14:51:25.037 に答える
0

JOINDB2では単純なUPDATEステートメント(一見恣意的な制限の1つ)でを使用できないため、この問題が発生しています。

DB2でこれを行う最良の方法は、を使用することMERGEです。このようなものが機能するはずです:

merge into salesorders
    using transfers
    on transfers.orderno = salesorders.orderno and (
           transfers.ordtext = salesorders.ordtext or (
               transfers.ordtext is null and 
               salesorders.ordtext is null
           )
       )
    when matched then update set
        salesorders.transref = transfers.transref;
于 2012-09-26T15:48:28.480 に答える
0

MERGEは、SQLRPGLEに埋め込まれているか、インタラクティブなSTRSQLを使用して、正常に機能します。

于 2014-02-10T19:56:12.073 に答える