0

私は、初めて Oracle を使用する SQL Server 開発者です。また、SQL サーバーで簡単に作成できる UPDATE ステートメントに問題があります。

列 KeyVal1、Keyval2、KeyVal3、NonKeyVal1、... KeyVal1 2 と 3 が複合キーであるテーブル T1 があるとします。

T1 の複合キーに対する外部キー関係を持つテーブル T2 もあります。T2 にレコードが存在する場合、T1.NonKeyVal1 と T1.NonKeyVal2 を更新したいと考えています。

T-SQL では、次のように記述します。

Update T1
Set    NonKeyVal1 = 'x',
       NonKeyVal2 = 'y'
FROM   T1
JOIN   T2 ON T1.KeyVal1 = T2.KeyVal1 AND 
             T1.KeyVal2 = T2.KeyVal2 AND 
             T1.KeyVal3 = T2.KeyVal3;

しかし、Oracle SQLでこれを理解するのに苦労しています。誰でも助けてもらえますか?

4

3 に答える 3

1

特定の列で結合する T2 の値に基づいて T1 を更新する場合、結合列がテーブルの制約によって一意であることが保証されていれば、Oracle で更新可能なビューを作成できます。

したがって、keyval1、keyval2、および keyval3 に一意または主キーの制約がある場合は、次のように記述できます...

Update (
  select t1.NonKeyVal1 t1_NonKeyVal1,
         t1.NonKeyVal2 t1_NonKeyVal2,
         t2.NonKeyVal1 t2_NonKeyVal1,
         t2.NonKeyVal2 t2_NonKeyVal2
  from   t1 join t2 on (
           T1.KeyVal1 = T2.KeyVal1 AND 
           T1.KeyVal2 = T2.KeyVal2 AND 
           T1.KeyVal3 = T2.KeyVal3))
set t1_NonKeyVal1 = t2_NonKeyVal1,
    t1_NonKeyVal2 = t2_NonKeyVal1;

あなたのケースはもう少し単純です:

Update (
  select t1.NonKeyVal1,
         t1.NonKeyVal2
  from   t1 join t2 on (
           T1.KeyVal1 = T2.KeyVal1 AND 
           T1.KeyVal2 = T2.KeyVal2 AND 
           T1.KeyVal3 = T2.KeyVal3))
set NonKeyVal1 = 'x',
    NonKeyVal2 = 'y';

制約がない場合、文書化されていないオプティマイザーのヒントを使用して更新結合カーディナリティ チェックをバイパスする非公式の回避策がありましたが、あまり安全ではありませんでした。

現在、制約がない場合、結合テーブルから値を参照する必要がある場合は MERGE ステートメントを使用できます。または、ケースがより単純であるため、他の人が提案した相関サブクエリで十分です。

于 2013-04-04T13:46:40.863 に答える
1

これを試して

Update T1
Set    NonKeyVal1 = 'x',
       NonKeyVal2 = 'y'
FROM   T1 WHERE EXISTS (
SELECT 1 FROM T2 WHERE T1.KeyVal1 = T2.KeyVal1 AND 
             T1.KeyVal2 = T2.KeyVal2 AND 
             T1.KeyVal3 = T2.KeyVal3);
于 2013-03-04T20:35:00.037 に答える
1

これを相関サブクエリとして記述する必要があります。

update t1
set    nonkeyval1 = 'x'
where  exists (select null
               from   t2
               where  t1.keyval1 = t2.keyval1
               and    t1.keyval2 = t2.keyval2
               and    t1.keyval3 = t3.keyval3);
于 2013-03-04T20:35:30.490 に答える