2012-12-26 38 views
8

我已經創建了兩個表,T1和T2各有一列,分別爲abc和xyz。我在每個表格中插入了2行(數值1和2)。刪除語句 - 子查詢應該拋出錯誤

當我運行命令"select abc from t2"時,它會拋出一個錯誤,指出表格中不存在列abc。但是,當我運行命令"delete from t1 where abc in (SELECT abc from t2);"時,將刪除2行。

不應該刪除失敗,因爲我已經使用了子查詢中失敗的相同語句?

create table t1(abc number); - 創建表

create table t2(xyz number); - 創建表格

insert into t1 values(1); - 一行插入

insert into t1 values(2); - 一行插入

插入t2值(1); - 一行插入

插入t2值(2); - 插入一行

從t2中選擇abc; --ORA-00904 - >因爲在t2中不存在列abc

從t1中刪除where abc in(SELECT abc from t2); --2行刪除

+3

我想這是因爲'DELETE'語句中的'abc'意味着't1'中的'abc' – luiges90

+0

嘗試在最後一個查詢中運行select以確認哪些是返回的行,然後您將有更好的主意哪些abc值正在返回 –

+0

感謝您的答覆。當我使用別名「從t1中刪除abc in(在t2中選擇t2.abc)時,它會拋出一個錯誤。但是不應該拋出一個錯誤,即使沒有這個錯誤,因爲我已經使用了」select abc from t2「? – Orangecrush

回答

11

如果使用表名作爲別名,以確保t2表列得到選擇,你會得到錯誤即

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

原始查詢沒有失敗因爲它使用表t1abc列,因爲表t1在子查詢中可見。

1

由於您在Where條件中使用過的abc列名,您的Delete語句正在工作。子查詢正在執行基於where條件列,因爲我們不使用表別名。

如果你看到這些查詢

SELECT * FROM T1其中ABC中(選擇T2 ABC); - 它會給出2行

select * from t1 where abc in(SELECT 1 from t2); - 它會給1行

select * from t1 where abc in(SELECT 2 from t2); - 它將檢索第二行

select * from t1 where abc in(SELECT 3 from t2); - 不會得到d數據

select * from t1 where abc in(SELECT hg from t2); - 無效的標識符