0

このクエリを使用して、データ ストア内の別のテーブルから値を収集して、テーブル内の列の 1 つを更新しようとしています。

UPDATE tablename PT
SET DID = (select distinct(did) from datastore.get_dept_alias
where upper(ltrim(rtrim(deptalias))) = upper(ltrim(rtrim(PT."Dept Descr")))
AND cid = PT.CID)

注: 表の両方の列名は、入力したものと同じです

ORA 01427 エラーが発生します。問題について何か考えはありますか?このORAエラーの他の投稿を理解しようとしています

4

2 に答える 2

2

ここでわかるように

SQL エラー: ORA-01427: 単一行のサブクエリが複数の行を返します

これは、サブクエリが

select distinct(did) from datastore.get_dept_alias
where upper(ltrim(rtrim(deptalias))) = upper(ltrim(rtrim(PT."Dept Descr")))
AND cid = PT.CID)

複数の行を返しています。

distinct (did)それで、あなたはそれがユニークだと確信していますか?そうではないようです。where rownum = 1どの値が更新に使用されるかわからないため、使用はお勧めしません。ORDER BY を使用しない限り。

于 2012-09-10T19:32:44.503 に答える
1

select ステートメントが複数の結果を返す可能性があるため、このエラーが発生します。複数の結果を返す可能性があるクエリで単一のセルを更新することはできません。

多くの SQL 言語でこれを回避する一般的な方法は、トップ 1 などを使用して、1 つの結果のみを返すことをエンジンに保証することです。クエリが 1 つの結果しか返さないことがわかっている場合でも、これを行う必要があることに注意してください。あなたが知っているからといって、エンジンがそれを知っているわけではありません。エンジンは、現在の状態だけでなく、将来の可能性からもあなたを保護する必要があります。

アップデート:

質問をOracleに更新したことに気づきました。where rownum = 1その場合、句を使用してサブクエリを単一の結果に制限できます。他の回答が指摘したように、トップ1が戻ってくることを確実にするために、さらにロジックを使用する必要があります。どれが正しいのかわからない場合は、最初にそれを解決してください。

あなたは何をするのか誤解しているかもしれないという考えも私には浮かびますDISTINCT。これにより、返される結果が一意になりますが、複数の一意の結果が存在する可能性があります。

于 2012-09-10T19:28:47.380 に答える