0

次のような簡単な更新ステートメントがあります。

UPDATE table_1 t1 SET (t1.a, t1.b, t1.c) = 
 (SELECT t2.x, t2.y, t3.z 
  FROM table_2 t2, table_3 t3, table_4 t4
  WHERE 
  1 = 1
  AND t2.id = t3.id
  AND t2.id1 = t4.id1
  AND t2.name = t1.name
  ) WHERE EXISTS
(SELECT 1 FROM t2
 WHERE
 1 = 1
 AND t2.name = t1.name
)

内部の SELECT クエリで結果が得られます。しかし、UPDATE クエリ全体を実行すると、次のエラーで失敗します。この更新クエリで間違いを犯した場合はお知らせください。

t2.name = t1.name 条件により、テーブル t2 から複数のエントリが得られる可能性があるため、MERGE ステートメントを使用できないことに注意してください。この場合、merge ステートメントはエラー can't get stable set of rows で失敗する可能性があります。他のより良いアプローチがあれば教えてください。

更新: t1.a には NOT NULL 制約があります。そして、私の内部クエリは、t2.x を NULL として持たない結果を返します。

4

2 に答える 2

0

問題は、SET 部分の SQL が EXITS の SQL よりも選択的である可能性があります。その場合は、存在を次のように変更します
... EXISTS ( SELECT 1 from
FROM table_2 t2, table_3 t3, table_4 t4
WHERE
t2.id = t3.id
AND t2.id1 = t4.id1
AND t2.name = t1.name


また、a、b、c が非 null として定義されている場合、すべての x、y、または z 列は null 値であってはなりません (t1.a が null でない場合など、すべての x は null であってはなりません)。

于 2013-02-23T12:27:22.530 に答える
0

そのエラーが発生する理由を見つけました。条件 t2.name = t1.name で、テーブル table_1 に 2 つの行を取得していました。最初の行には、内部選択クエリからの値 t2.x がありました。2行目はしませんでした。したがって、エラーが発生していました。クエリを次のように変更しました。

UPDATE table_1 t1 SET (t1.a, t1.b, t1.c) = 
 (SELECT t2.x, t2.y, t3.z 
  FROM table_2 t2, table_3 t3, table_4 t4
  WHERE 
  1 = 1
  AND t2.id = t3.id
  AND t2.id1 = t4.id1
  AND t2.name = t1.name
  ) WHERE t1.id, t1.name IN
(SELECT t1.id, t1.name FROM table_2 t2, table_3 t3, table_4 t4
  WHERE 
  1 = 1
  AND t2.id = t3.id
  AND t2.id1 = t4.id1
  AND t2.name = t1.name
)

それが他の人を助けることを願っています。

于 2013-02-23T12:28:59.573 に答える