※ ChatGPTを利用し、要約された質問です(原文:ORACEL UPDATEがうまくいきません)
ORACEL UPDATEがうまくいかない?対処法を教えてください
このQ&Aのポイント
明けましておめでとうございます。本年もよろしくお願いします。覚えたてのRANK関数を使って以下の処理を実現したいのですが、うまくいきません。エラー”ORA-01427: 単一行副問合せにより2つ以上の行が戻されます”が出てしまいます。どのように対処すれば良いか、教えて頂けないでしょうか?
SQL文も長々となってしまい、後々メンテ時には苦労しそうなので、RANK文以外に何かいい案があれば教えて頂きたいと思います。マージは使用しない方針らしいので、それ以外で何かないでしょうか・・
トランより抽出したレコードの店CDより、マスタのデータを更新する。存在しない店CDの場合、追加を行う。ただしトラン上に同一店CDのレコードが複数存在する場合は、登録日の新しいもの優先する。登録日が同じ場合は、登録者の大きい方を対象とする。登録日、登録者ともに同じ場合は、連番の小さい方を優先する。
明けましておめでとうございます。本年もよろしくお願いします。
覚えたてのRANK関数を使って以下の処理を実現したいのですが、うまくいきません。
エラー”ORA-01427: 単一行副問合せにより2つ以上の行が戻されます”が出てしまいます。
どのように対処すれば良いか、教えて頂けないでしょうか?
※SQL文は最後尾に記載しています。INSERT文の方は、うまくいってます(2000文字越えのため
INSERT文は載せていません)
UPDATEの方は、UPDATE文を除いてSELECT文では店コードは各1件しか表示されないのですが・・・
また、SQL文も長々となってしまい、後々メンテ時には苦労しそうなので、RANK文以外に
何かいい案があれば教えて頂きたいと思います。
※マージは使用しない方針らしいので、それ以外で何かないでしょうか・・
以上、よろしくお願いします。
【処理】
トランより抽出したレコードの店CDより、マスタのデータを更新する。
存在しない店CDの場合、追加を行う。
ただし
トラン上に同一店CDのレコードが複数存在する場合は、登録日の新しいもの優先する。
登録日が同じ場合は、登録者の大きい方を対象とする。
登録日、登録者ともに同じ場合は、連番の小さい方を優先する
例)
トラン(キー:日付・連番)
日 付 連番 登録日 登録者 店CD データ
┼───┼──┼───┼───┼───┼───┼
│12/10 │001 │12/09 │ 80 │ 0001 │DATA-A│
│12/10 │002 │12/10 │ 10 │ 0001 │DATA-B│→登録日が新しい方を優先
│12/10 │003 │12/10 │ 10 │ 0003 │DATA-C│
│12/10 │004 │12/10 │ 50 │ 0005 │DATA-D│
│12/10 │005 │12/10 │ 80 │ 0005 │DATA-E│→登録日が同じ場合、登録者の大きい方を優先
│12/10 │006 │12/10 │ 20 │ 0005 │DATA-F│
│12/10 │007 │12/10 │ 10 │ 0006 │DATA-G│→登録日、登録者が同じ場合、連番の小さい方を優先
│12/10 │008 │12/10 │ 10 │ 0006 │DATA-H│
マスタ(キー:店CD)
店CD データ
┼───┼───┼
│ 0001 │DATA-Z│
│ 0002 │DATA-Y│
│ 0004 │DATA-W│
│ 0005 │DATA-V│
│ 0006 │DATA-R│
【結果】
マスタ(キー:店CD)
店CD データ
┼───┼───┼
│ 0001 │DATA-A│→更新
│ 0002 │DATA-Y│
│ 0003 │DATA-C│→追加
│ 0004 │DATA-W│
│ 0005 │DATA-E│→更新
│ 0006 │DATA-R│→追加
■更新用のSQL
UPDATE マスタ SET(
データ
)=(
SELECT
データ
FROM
(SELECT *
FROM (SELECT
RANK() OVER(PARTITION BY 店CD
ORDER BY 登録日 DESC,
登録者 DESC,
連番 ) wRANK,
店CD,
データ
FROM トラン
WHERE
EXISTS(SELECT * FROM マスタ WHERE トラン.店CD=マスタ.店CD)
)
WHERE wRANK = 1
)
);
お礼
pcb39431 様 >...最後のWHERE句のところで、トラン.店CD=マスタ.店CD が必要なような気がするのですが。 ご指摘頂いた内容を加え、正しく動作できました。 ありがとうございました。 また、よろしくお願いします。