2012-11-27 59 views
2

我有這個queury:有沒有比使用子查詢編寫SQL SELECT語句更好的方法?

SELECT A, B, C 
FROM ( SELECT 
     lla.id as A, 
     max(decode(lla.attrid, 2, lla.valstr, null)) as B, 
     max(decode(lla.attrid, 3, lla.valstr, null)) as C 
    FROM 
     llattrdata lla, 
     llattrdata lla2 
    WHERE 
     lla.id = lla2.id 
    GROUP BY lla.id) 
WHERE C = "Yes" 

有沒有更好的方式來做到這一點?我嘗試使用HAVING子句,但無法使其對C列「是」起作用。提前致謝。

+2

這是無效的SQL,除非你有一個名爲'Yes'的列。派生表(它不是一個子查詢)沒有任何處理開銷,它只是語法糖,所以不用擔心。 –

回答

3

我會讓你變成一個祕密。你有什麼沒有錯。所以不要提供重寫它的需要。

SELECT A, B, C 
FROM ( SELECT 
     lla.id as A, 
     max(decode(lla.attrid, 2, lla.valstr, null)) as B, 
     max(decode(lla.attrid, 3, lla.valstr, null)) as C 
    FROM 
     llattrdata lla, 
     llattrdata lla2 
    WHERE 
     lla.id = lla2.id 
    GROUP BY lla.id) 
WHERE C = 'Yes' 

是相同的性能爲:

SELECT 
    lla.id as A, 
    max(decode(lla.attrid, 2, lla.valstr, null)) as B, 
    max(decode(lla.attrid, 3, lla.valstr, null)) as C 
FROM 
    llattrdata lla, 
    llattrdata lla2 
WHERE 
    lla.id = lla2.id 
GROUP BY lla.id 
HAVING max(decode(lla.attrid, 3, lla.valstr, null)) = 'Yes'; 

你會被這裏避免了內嵌視圖獲得任何性能。無論哪一個對你來說都是可讀的,就去做吧。

+0

這裏有幾個很好的答案,但是當你繼續談論性能時,我檢查了你的答案。 –

2

如何

SELECT 
     lla.id as A, 
     max(decode(lla.attrid, 2, lla.valstr, null)) as B, 
     'Yes' as C 
    FROM 
     llattrdata lla, 
     llattrdata lla2 
    WHERE 
     lla.id = lla2.id 
    GROUP BY lla.id 
    HAVING max(decode(lla.attrid, 3, lla.valstr, null)) = 'Yes' 

你不能使用你在同一個查詢中創建一個別名。你必須再次寫入

+1

我希望你不介意編輯。 –

+0

不,我喜歡它。謝謝 – Marc

+0

我喜歡「'是'C」。我沒有想到這一點。 –

1

使用HAVING clause

SELECT 
    lla.id as A, 
    max(decode(lla.attrid, 2, lla.valstr, null)) as B, 
    max(decode(lla.attrid, 3, lla.valstr, null)) as C 
FROM 
    llattrdata lla, 
    llattrdata lla2 
WHERE 
    lla.id = lla2.id 
GROUP BY lla.id 
HAVING max(decode(lla.attrid, 3, lla.valstr, null)) = 'Yes' 

這一條款是GROUP BY後評估,並用於對分組結果進行過濾。

不幸的是,你不能在having子句中使用別名。在某些情況下,子查詢可能會比有條件更清晰。

相關問題