標準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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- word表格標題行重複怎麼設定 word表格標題行無法重複的方法
- LeetCode 26 號問題 刪除陣列中的重複項LeetCode陣列
- Dynamics CRM 資料匯出到Excel時列標題不能重複Excel
- 面試必問的陣列去重複面試陣列
- 問題定級標準
- 【java】ObjectOutputStream & ObjectInputStream 多次寫入發生重複寫入相同資料的問題JavaObject
- 資料檢視的重複問題
- RCmongodb出現id重複問題的簡單解決辦法jztMongoDB
- 資料標準化遇到的問題
- JS中的陣列複製問題JS陣列
- 無重複字元的最長子串問題 (移動視窗法求解)字元
- 併發請求的重複插入問題
- sql - distinct 去重複的用法SQL
- Android studio glide包重複問題AndroidIDE
- 題目:刪除排序陣列中的重複項排序陣列
- 去除重複字母(不同字元的最小序列)問題字元
- [每日一題] 第十九題:陣列中重複的數字每日一題陣列
- element UI元件樣式重複問題UI元件
- webpack dll打包重複問題優化Web優化
- java陣列中重複元素的去重Java陣列
- 答讀者問:關於隱式 id 重複的問題
- 陣列(引用型別)複製問題陣列型別
- 海外網站title標題,防止Google重寫網站Go
- 探索RocketMQ的重複消費和亂序問題MQ
- 解決alertmanager重複傳送訊息的問題
- 解決生產日誌重複列印的問題
- 解決Linq.ToDictionary()時的鍵重複問題
- Openlayers4地圖重複出現的問題地圖
- 陣列中重複的數字陣列
- 去除DataTable指定列的重複行
- 解決 HttpServletRequest 的輸入流不能重複讀的問題HTTPServlet
- **【求助】關於抽樣和標準化的問題**
- 每日一題 [26] 刪除排序陣列中的重複項每日一題排序陣列
- 解決winform窗體重複建立問題ORM
- 關於二維陣列指標的問題陣列指標
- 設定SQL標識列的值SQL
- 【力扣】排列問題(回溯法)(去重)力扣
- Next.js-頁面重複渲染引出的水合問題JS
- SEO如何減少網站複製重複內容過多的問題?網站