標準SQL寫法的重複列問題

yangtingkun發表於2008-06-06

昨天測試BUG的時候使用標準SQL的連線寫法偶然發現的問題,這裡簡單記錄一下。

 

 

看一個簡單的例子:

SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));

表已建立。

SQL> CREATE TABLE T1 (ID NUMBER, NAME VARCHAR2(30));

表已建立。

SQL> INSERT INTO T VALUES (1, 'T');

已建立 1 行。

SQL> INSERT INTO T1 VALUES (1, 'T1');

已建立 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT ID, NAME FROM T, T1
  2  WHERE T.ID = T1.ID
  3  ;
SELECT ID, NAME FROM T, T1
           *
1 行出現錯誤:
ORA-00918:
未明確定義列


SQL> SELECT ID, NAME FROM T INNER JOIN T1
  2  ON T.ID = T1.ID
  3  ;
SELECT ID, NAME FROM T INNER JOIN T1
           *
1 行出現錯誤:
ORA-00918:
未明確定義列

顯然這種寫法無論是對Oracle的預設寫法,還是對標準SQL寫法,都是行不通的,因為Oracle無法確定查詢的IDNAME是屬於哪張表的。

那麼下面增加一張表:

SQL> CREATE TABLE T2 (ID NUMBER, NAME VARCHAR2(30));

表已建立。

SQL> INSERT INTO T2 VALUES (1, 'T2');

已建立 1 行。

SQL> SELECT ID, NAME FROM T, T1, T2
  2  WHERE T.ID = T1.ID
  3  AND T.ID = T2.ID;
SELECT ID, NAME FROM T, T1, T2
           *
1 行出現錯誤:
ORA-00918:
未明確定義列


SQL> SELECT ID, NAME
  2  FROM T INNER JOIN T1
  3  ON T.ID = T1.ID
  4  INNER JOIN T2
  5  ON T.ID = T2.ID;

        ID NAME
---------- ------------------------------
         1 T2

神奇的現象出現了,對於Oracle的預設寫法,Oracle仍然報錯未明確定義列,但是對於標準SQL寫法,居然可以成功執行,而且根據查詢結果看,返回的記錄是T2表的,那麼是否可以這樣進行推測,對於標準寫法而言,如果查詢的時候不指定列的所在表資訊,那麼Oracle選擇最後一個連線表的列。

再做一個簡單的例子驗證一下這個推測:

SQL> CREATE TABLE T3 (ID VARCHAR2(1), NAME VARCHAR2(30));

表已建立。

SQL> INSERT INTO T3 VALUES ('1', 'T3');

已建立 1 行。

SQL> SELECT ID, NAME
  2  FROM T INNER JOIN T1
  3  ON T.ID = T1.ID
  4  INNER JOIN T2
  5  ON T.ID = T2.ID
  6  INNER JOIN T3
  7  ON T.ID = T3.ID;

I NAME
- ------------------------------
1 T3

果然如此,只是不知道這個特性是標準函式寫法中規定的,還是Oracle自己的特性。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-332700/,如需轉載,請註明出處,否則將追究法律責任。

相關文章