2012-05-11 20 views
1

私はAskTomサイトを見ていて、何が更新用の非常に強力なツールであるべきかを知っていましたが、私の声明ではサブクエリの後にエイリアスを受け入れることを拒否しました。 誰かが私のためにこれを説明し、おそらく解決策を提示してもらえますか?更新(いつから選択)ステートメントがテーブルエイリアスを認識しないのはなぜですか?

Update (SELECT T.Date_,T.Name_ 
     FROM TableA T, TableB P 
     WHERE P.Date_ = T.Date_ 
     AND P.Name_ = T.Name_) SET P.ID = T.Name_ 

このタイプのアップデートを実行する方法については他にも問題がありますが、それはボーナスになります。エイリアスの問題を理解しようとすると、この時点でもっと興味があります。私は

TableB.ID = TableA.Name_ 

でサブに試してみましたが、運

は、具体的にエラーがORA-00904無効な識別子ではありません。

いつもありがとうございます。

上記の問題は私には答えられましたが、私はそれを理解しようとすると他のものがあります。

これで、ORA-01779は、非キー保存テーブルにマップする列を変更できません。 これは私が正しい更新しようとしているテーブルを参照していると推測しますか?私がpkやfkを持っていないかもしれないビューやその他の適切なソースから更新することができました。

このタイプの更新文は、Oracleの一時表と連携できますか、または問題は予期できますか?

Caseステートメントでこのタイプのステートメントを使用して、TableAの複数の列を更新することはできますか、それとも問題はありますか?

もう一度おねがいします。

+0

それは「エイリアスを受け入れることを拒否」するためには何を意味するのでしょうか?どのようなエラーが出ますか? 'TableA'と' TableB'の両方に 'Date_'と' Name_'という列がありますか? –

+0

上記の特定のエラーを追加しました。両方のテーブルに正しいcolがあります。 – dee

答えて

5

UPDATE (query)操作を実行すると、括弧の外側で使用できる唯一の列は、クエリによって返された列の名前です。この場合、Date_とName_です。クエリで使用したテーブルエイリアスは、カッコの外側でも有効ではありません。あなたはそのために必要なもの

は次のとおりです。

Update (SELECT P.ID ,T.Name_ 
     FROM TableA T, TableB P 
     WHERE P.Date_ = T.Date_ 
     AND P.Name_ = T.Name_) SET ID = Name_ 
+0

ありがとうTony、私はそれがTableBのIDを更新する方法を理解しようとしていますか? TableAにもID列がある場合はどうなりますか? – dee

+0

その場合、サブクエリに別のエイリアスを付ける必要があります。 '(t.id、p.idをP_ID ...として選択してください。 –

+0

ああ、私は今それを見ています...ありがとうトニー。 – dee

関連する問題