標準SQL寫法的重複列問題
昨天測試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無法確定查詢的ID和NAME是屬於哪張表的。
那麼下面增加一張表:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sql重複插入問題SQL
- 刪除重複資料的三種sql寫法SQL
- word表格標題行重複怎麼設定 word表格標題行無法重複的方法
- 關於SQL的重複記錄問題SQL
- 利用sql語句找出表中有重複記錄的三種sql寫法SQL
- 面試必問的陣列去重複面試陣列
- DB2 去重複行的寫法DB2
- Dynamics CRM 資料匯出到Excel時列標題不能重複Excel
- 【SQL*Plus】處理 SQL*Plus的標頭無法顯示問題SQL
- 有重複元素的排列問題
- 【java】ObjectOutputStream & ObjectInputStream 多次寫入發生重複寫入相同資料的問題JavaObject
- LeetCode 26 號問題 刪除陣列中的重複項LeetCode陣列
- android包重複問題Android
- 資料檢視的重複問題
- merge into_目標表匹配列重複與源表匹配表重複的區別
- 資料標準化遇到的問題
- Web標準中的常見問題Web
- 無重複字元的最長子串問題 (移動視窗法求解)字元
- RCmongodb出現id重複問題的簡單解決辦法jztMongoDB
- Go指標複製問題Go指標
- JS中的陣列複製問題JS陣列
- 併發請求的重複插入問題
- 解決表單重複提交的問題
- strust2 重複提交的問題Rust
- 題目:刪除排序陣列中的重複項排序陣列
- SQL查詢列(欄位)重複值及操作--整理SQL
- Androidstudio中jar包重複或jar包裡的類重複問題AndroidJAR
- Sql中游標和加鎖的問題 (轉)SQL
- MS SQL Server常見問題 -- 分組 去重複 查詢 統計SQLServer
- java陣列中重複元素的去重Java陣列
- sql - distinct 去重複的用法SQL
- 去除重複字母(不同字元的最小序列)問題字元
- [每日一題] 第十九題:陣列中重複的數字每日一題陣列
- webpack dll打包重複問題優化Web優化
- 標準的 SQL 解析順序SQL
- 如何透過Canonical標籤解決重複內容收錄問題?
- 海外網站title標題,防止Google重寫網站Go
- 陣列中重複的數字陣列