1

次のSQLステートメントを機能させようとしています。

UPDATE myschema.tableA update_tableA
   SET field_id = 
   ( SELECT src.field_id 
         FROM myschema.srcTable src
         INNER JOIN myschema.tableB tableB ON 
            update_tableA.id = tableB.id 
            AND SDO_ANYINTERACT( tableB.shape, src.shape ) = 'TRUE' );

このステートメントを実行すると、次のエラーが発生します。

ORA-00904: "UPDATE_TABLEA"."ID": invalid identifier

ネストされたselect内のネストされたselectの外部でスコープされた変数を使用できませんか?何かご意見は?

PS識別子はデータベーステーブルで実際に有効です。問題は範囲にあるように見えますが、それが確かに問題であることを確認したいと思います。

4

4 に答える 4

3

結合されているテーブルのいずれにも含まれていない列で JOIN できる (つまり、ON 句で使用する) ことはできないと思います。追加の述語は WHERE 句にある必要があります。

これを試して:

UPDATE myschema.tableA update_tableA
   SET field_id = 
   ( SELECT src.field_id 
         FROM myschema.srcTable src
         INNER JOIN myschema.tableB tableB ON 
           SDO_ANYINTERACT( tableB.shape, src.shape ) = 'TRUE'
        WHERE update_tableA.id = tableB.id 
   );
于 2008-11-14T21:03:54.187 に答える
0

上記のSQLを見て、これが私が考えていることです

1)myschema.tableAにID列がありません(field_id
の可能性があります)2)SELECTが結合条件を提供していないようです

SELECT src.field_id FROM myschema.srcTable src INNER JOIN myschema.tableB tableB ON

tableBでsrcを結合する条件はどこにありますか?

于 2008-11-14T20:16:52.643 に答える
0

次のテストでわかるように、更新のフィールドはネストされた選択で使用できます。

drop table test;
create table test as (select 1 key, 'a' value from dual);
insert into test values (2,'b');
select * from test;
update test t1 
   set value = (select 'c' from dual where t1.key=2);
select * from test;

この場合、なぜうまくいかないのかわかりません。TableA との明示的な結合が必要なようです。

于 2008-11-14T21:00:47.110 に答える
0

私は Oracle に精通していないことを認めなければなりませんが、SQL Server の SQL 方言には多かれ少なかれ打ちのめされています。最後に見たとき、この SQL ダイアレクトでは、UPDATE ステートメントで更新するテーブルのエイリアスを指定できませんでした。つまり、SQL Server では、識別子update_tableA.idは無効です。Oracleにも同じ制限がある可能性はありますか?

于 2008-11-15T09:26:44.173 に答える