2015-04-01 90 views
-1

我有一個SQL Server的查詢語句是這樣的:合併2選擇語句的最佳方法是什麼?

WITH A 
AS (
    SELECT (
      SUM(CASE 
        WHEN (t1.price) > 0 
         THEN (t1.price) 
        ELSE 0 
        END) 
      ) AS pr1 
     ,(
      ABS(SUM(CASE 
         WHEN (t1.price) < 0 
          THEN (t1.price) 
         ELSE 0 
         END)) 
      ) AS pr2 
    FROM dbo.price_table AS t1 
    ) 
    ,B 
AS (
    SELECT (WHEN(pr1 - pr2) < 0 THEN ABS(pr1 - pr2) ELSE 0 END) AS res 
    FROM A 
    ) 
SELECT res 
FROM B 
我的查詢

,我用2 select語句實現「資源」一欄,但我想實現在1個select語句「資源」一欄。

什麼是合併的最佳途徑2選擇語句到1選擇語句查詢?

+1

爲什麼不使用聯合? – 2015-04-01 14:42:26

+0

這個sql查詢是我的總查詢的一部分。這只是一個例子。 我想知道如何可以與其他方式的子查詢合併... – 2015-04-01 14:52:21

+0

從技術上講它是一個查詢。它將以與子查詢相同的方式進行編譯。你希望從重組中得到什麼好處? – 2015-04-01 14:53:51

回答

3

你的計算看起來很複雜。你正在取正值的總和。然後,使用ABS()將負值的總和作爲正值,然後減去此結果。你猜怎麼了?這與首先​​將所有值取爲SUM()相同。

所以,我覺得這種說法是等價的:

SELECT (CASE WHEN SUM(t1.price) < 0 
      THEN ABS(SUM(t1.price)) 
      ELSE 0 
     END) 
FROM dbo.price_table t1; 
+0

我的sql查詢只是一個例子。我想知道如何可以合併子查詢或其他方式 – 2015-04-01 14:49:07

+0

@MehdiRadi。 。 。那麼你應該問一個更現實的例子*另一個問題。這個問題已經有了答案,所以改變這個問題是不禮貌的,因爲它會使答案失效。 – 2015-04-01 15:07:48

0

Common Table Expressions(CTE的)是編寫可重用子查詢的方式。有沒有一種方法,與所有的熱膨脹係數(CTE的作品可以自引用這是不可能的subqueries_。在您的例子中,查詢

WITH A AS 
(
    {A query} 
) 
,B AS 
(
    SELECT ... res FROM A 
) 
SELECT res FROM B 

可以重新安排,以

SELECT res FROM 
(
    SELECT {expression} res FROM 
    (
     {A query} 
    ) 
) 

這僅僅是

SELECT {expression} res FROM 
(
    {A query} 
) 
0

您的解決方案是好的。 即使你使用multipple「選擇」報表,他們將在一個查詢編譯。 所以您的查詢等同於Gordon Linoff提出的查詢。

如果您有更復雜的邏輯,您可以創建SINGLE查詢:將最後一個「Select ...」和子查詢(或表達式)替換爲「pr1」和「pr2」。您可能會收到帶有可重複部分的非常複雜的陳述。

當您使用「WITH」時,您可以將邏輯部分拆分爲具有良好的可讀性,而性能不會降低。我總是在複雜的查詢中提供「WITH」。

+0

謝謝,但如何能爲我的查詢創建一個單一的查詢? – 2015-04-01 18:22:36

相關問題