8

T1とT2の2つのテーブルを作成し、それぞれabcとxyzの1つの列を作成しました。各テーブルに2行(数値1と2)を挿入しました。

コマンドを実行する"select abc from t2"と、列abcがテーブルT2に存在しないというエラーがスローされます。ただし、コマンドを実行すると"delete from t1 where abc in (SELECT abc from t2);"、2行が削除されます。

サブクエリで失敗したのと同じステートメントを使用したので、削除は失敗するべきではありませんか?

テーブルt1(abc番号)を作成します。-作成されたテーブル

テーブルt2(xyz番号)を作成します。-作成されたテーブル

t1値に挿入します(1); --1行挿入

t1値に挿入します(2); --1行挿入

t2値に挿入します(1); --1行挿入

t2値に挿入します(2); --1行挿入

t2からabcを選択します。--ORA-00904->列abcがt2に存在しないため

t1から削除します。ここでabcin(SELECT abc from t2); --2行が削除されました

4

2 に答える 2

11

テーブル名をエイリアスとして使用して、テーブル t2 列が選択されていることを確認すると、エラーが発生します。

 delete from t1 where abc in (SELECT t2.abc from t2); --ORA-00904 

サブクエリでテーブルが表示されるため、テーブルabcの列を使用しているため、元のクエリは失敗しません。t1 t1

于 2012-12-26T06:16:58.330 に答える
1

Where条件で使用したabc列名のために、Deleteステートメントが機能しています。テーブルエイリアス名を使用しないため、サブクエリは where 条件列に基づいて実行されます。

これらのクエリを見たら

select * from t1 where abc in (SELECT abc from t2); -- 2 行になります

select * from t1 where abc in (SELECT 1 from t2); -- 1行になります

select * from t1 where abc in (SELECT 2 from t2); -- 2 行目を取得します

select * from t1 where abc in (SELECT 3 from t2); -- d データを取得しません

select * from t1 where abc in (SELECT hg from t2); - 無効な識別子

于 2012-12-26T09:41:07.187 に答える