2016-03-25 23 views
1

本当にこのヘルプが欲しいです。私は2つのテーブルを持ってt1とt2を言うことができます。私はt2から取得した値に基づいてt1を更新します。 t1とt2の間には、t1.username = t2.emaiAddressの共通フィールドがあります。 t1.usernameを更新する方法はありますか?以下は別のテーブルフィールドに基づいてテーブル列を更新する

は、これは私が様々なものに適用することができます。この例からであると私はT1に言及しませんでしたT1とT2構造

create table t1 
    (
     username varchar2 (50) primary key, 
     password varchar2 (50) not null 
    ); 

    create table t2 
    (
     ID varchar2 (50) primary key, 
     emailAddress varchar2 (50) not null 
    ); 

です。私が試したのは

UPDATE (SELECT t1.username, 
        t1.emailAddress 
      FROM t1 join t2 on t1.username = t2.EMAILADDRESS 
      WHERE t2.id = 'SCM-026020') 
    SET t1.username = '[email protected]'; 

答えて

1

これは通常、Oracleでサブクエリを使用して行うことになります。

UPDATE t1 
    SET username = '[email protected]' 
    WHERE EXISTS (SELECT 1 
        FROM t2 
        WHERE t1.username = t2.EMAILADDRESS AND t2.id = 'SCM-026020' 
       ); 
+0

サブクエリのselect 1の機能を知りたいです – Programmer

+0

サブクエリを理解しましたが、なぜ1がそこにあるのですか?カラム名のインサータ – Programmer

+0

@Programmer。 。 。 'exists'はどんな行の存在も探しています。 '1'はそこに置くのは非常に簡単な値です - 明白です。私は 'NULL'値を扱わなければならないのは好きではありません。この値は既存のものとして扱われます。 –

0

あなたはこれを行うには3つの方法があります。

最初はマニュアルです。 2つのクエリを実行する必要があります.1つのクエリの更新によって関連が解除されるからです。

手動で複数のクエリを実行したくない場合は、t1.usernameとt2.emaiAddressの間に "カスケード更新"フラグを使用してforeingキー制約を実装します。このようにして、マスタを変更すると自動的にスレーブが更新されます(マスタは制約が実装されたものになります)。ただし、スレーブを更新するとエラーが発生します。

第3の方法は、更新前のトリガーを作成して、別のテーブルを更新することです。これは、第2のオプションを実行する「手動の」方法です。

+0

私はもっと良い理解を得るために例を挙げることができます。おかげで – Programmer

+0

私は2つのクエリの部分が好きですが、他の人も私に考えを喜ばせるでしょう – Programmer

0

のはusername='[email protected]」レコードがあるテーブルt1に仮定しましょう。そして、ID = 'SCM-026020'のt2のメールアドレスでこのユーザー名を更新する必要があります。

下記の質問をお試しください。

UPDATE t1 
SET t1.username = (SELECT emailAddress 
        FROM t2 
        WHERE ID = 'SCM-026020') 
WHERE t1.username = '[email protected]' 

これは、テーブルt1のユーザ名を「[email protected]」から「[email protected]」に更新します。これがあなたの望むものであることを願っています。

関連する問題