2016-01-13 121 views
0

我一些很老的遺留代碼一起工作,和我見過的結構是這樣查詢表VS同一表的查詢子查詢

SELECT 
    FieldA, 
    FieldB, 
    FieldC 
FROM 
    (
    SELECT * FROM TABLE1 
    ) 
    LEFT JOIN TABLE2 ON... 

幾個查詢是否有任何優勢來編寫查詢這條路?

這是在Oracle中。

+0

@GordonLinoff對不起,那是一個錯字 – DixieFlatline

+0

我相信外面的查詢帶來的是'左JOIN'的結果而你不能從表格中直接得到,什麼是'FIELDS'?你用它來代替'*'? –

+2

它真的只是一個直接的'SELECT * FROM TABLE1'作爲子查詢嗎?我無法想象這樣做的好理由。最好它的功能相同,最糟糕的是它使查詢難以閱讀。 – JNevill

回答

4

使用像這樣的子查詢似乎沒有優勢。原因可能是關於代碼的歷史遺蹟。

也許曾經有一次,那裏有一個更復雜的查詢。查詢被表/視圖取代,作者只是離開了原始結構。

同樣,曾幾何時,可能需要計算一列(比如對於外部查詢或select)。這個列然後被包含在表格/視圖中,但結構仍然存在。

我非常確定Oracle在智能查詢優化時可以忽略子查詢。並非所有的數據庫都很聰明,但您可能想要清理代碼。至少,子查詢看起來很尷尬。

0

在SQL中是基本的好習慣,你不應該代碼表全掃描(SELECT * FROM table,沒有一個WHERE條款),除非必要,對性能問題。

在這種情況下,這是沒有必要的:同樣的結果可以通過獲得:

SELECT 
    Fields 
FROM 
    TABLE1 LEFT JOIN TABLE2 ON...