2013-05-10 89 views
0

我試圖加快存儲過程,並具有以下子查詢:SQL查詢優化子查詢

SELECT 
    ... 
     ISNULL((SELECT Table1.Order WHERE Table2.STATUS <> 'R'),0) AS 'Order', 
     ISNULL((SELECT Table1.Order WHERE Table2.STATUS = 'R'),0) AS 'Reject', 
    ... 
FROM Table1 
LEFT JOIN 
Table2 
ON Table1.KEY=Table2.KEY 

有沒有辦法更有效地寫上面?

我在想IF語句什麼的,但不太清楚如何寫它。

我在問這個,因爲我讀過最好最小化子查詢來提高性能。

+1

是否有效的語法?子查詢中的FROM在哪裏? – mbeckish 2013-05-10 18:42:03

+3

請提供完整且有效的查詢。 – 2013-05-10 18:42:45

+0

爲什麼你選擇這兩個單獨的列? – 2013-05-10 18:42:49

回答

3

嘗試使用CASE WHEN:

SELECT 
     /* ... */ 
     [Order] = CASE 
        WHEN t2.STATUS <> 'R' THEN t1.[Order] 
        ELSE 0 
       END, 
     Reject = CASE 
        WHEN t2.STATUS = 'R' THEN t1.[Order] 
        ELSE 0 
       END 
     /* ... */     
FROM Table1 t1 
     LEFT JOIN Table2 t2 
     ON t1.[KEY] = t2.[KEY] 
+1

+1,但請不要使用「單引號」作爲別名 - 這種形式的某些形式已被棄用,並且使它們看起來像是一個很糟糕的字符串文字。 '[方括號]'是更受歡迎的。 – 2013-05-10 19:22:48

+0

謝謝@Aaron Bertrand。我編輯我的答案。 – 2013-05-10 19:24:09

+1

@Mike - 沒問題! – 2013-05-10 19:35:10

0

您可以嘗試使用Oracle 「聯盟」 等同爲SQL Server。我已經在Oracle 10g上工作過,可以使用like,

SELECT Table1.Order 
FROM Table1, Table2 
WHERE Table2.STATUS <> 'R' and Table1.id=Table2.id 

UNION or UNION ALL 

SELECT Table1.Order 
FROM Table1, Table2 
WHERE Table2.STATUS = 'R' and Table1.id=Table2.id 

我不確定這是否幫助你... !!無論如何...