2011-10-10 35 views
0

我有一個相當複雜的SQL查詢,在這裏我們需要返回的列數,並且每一個代表從表中不同的行。所有派生表都需要通過值進行過濾,以便僅爲該帳戶恢復一個表。下面的工程偉大:範圍派生表的

SELECT CurrentBalance.Value, 
     CurrentBalance.Customer, 
     Debt30Balance.Value AS Expr1, 
     Debt30Balance.Customer AS Expr2, 
     Debt60Balance.Value AS Expr3, 
     Debt60Balance.Customer AS Expr4, 
     Debt90Balance.Value AS Expr5, 
     Debt90Balance.Customer AS Expr6, 
     WIPCurrent.Value  AS Expr7, 
     WIPCurrent.Customer AS Expr8, 
     WIP30Days.Value  AS Expr9, 
     WIP30Days.Customer  AS Expr10, 
     WIP60Days.Value  AS Expr11, 
     WIP60Days.Customer  AS Expr12, 
     WIP90Days.Value  AS Expr13, 
     WIP90Days.Customer  AS Expr14 
FROM (SELECT TOP (1) Value, 
         Customer 
     FROM DebtBreakdown 
     WHERE (Customer = @CustomerID) 
       AND (Type = 0) 
     ORDER BY Timestamp DESC) AS CurrentBalance 
     INNER JOIN (SELECT TOP (1) Value, 
            Customer 
        FROM DebtBreakdown AS DebtBreakdown_7 
        WHERE (Customer = @CustomerID) 
          AND (Type = 1) 
        ORDER BY Timestamp DESC) AS Debt30Balance 
     ON CurrentBalance.Customer = Debt30Balance.Customer 
     INNER JOIN (SELECT TOP (1) Value, 
            Customer 
        FROM DebtBreakdown AS DebtBreakdown_6 
        WHERE (Customer = @CustomerID) 
          AND (Type = 2) 
        ORDER BY Timestamp DESC) AS Debt60Balance 
     ON Debt30Balance.Customer = Debt60Balance.Customer 
     INNER JOIN (SELECT TOP (1) Value, 
            Customer 
        FROM DebtBreakdown AS DebtBreakdown_5 
        WHERE (Customer = @CustomerID) 
          AND (Type = 3) 
        ORDER BY Timestamp DESC) AS Debt90Balance 
     ON Debt60Balance.Customer = Debt90Balance.Customer 
     INNER JOIN (SELECT TOP (1) Value, 
            Customer 
        FROM DebtBreakdown AS DebtBreakdown_4 
        WHERE (Customer = @CustomerID) 
          AND (Type = 4) 
        ORDER BY Timestamp DESC) AS WIPCurrent 
     ON Debt90Balance.Customer = WIPCurrent.Customer 
     INNER JOIN (SELECT TOP (1) Value, 
            Customer 
        FROM DebtBreakdown AS DebtBreakdown_3 
        WHERE (Customer = @CustomerID) 
          AND (Type = 5) 
        ORDER BY Timestamp DESC) AS WIP30Days 
     ON WIPCurrent.Customer = WIP30Days.Customer 
     INNER JOIN (SELECT TOP (1) Value, 
            Customer 
        FROM DebtBreakdown AS DebtBreakdown_2 
        WHERE (Customer = @CustomerID) 
          AND (Type = 6) 
        ORDER BY Timestamp DESC) AS WIP60Days 
     ON WIP30Days.Customer = WIP60Days.Customer 
     INNER JOIN (SELECT TOP (1) Value, 
            Customer 
        FROM DebtBreakdown AS DebtBreakdown_1 
        WHERE (Customer = @CustomerID) 
          AND (Type = 7) 
        ORDER BY Timestamp DESC) AS WIP90Days 
     ON WIP60Days.Customer = WIP90Days.Customer 

但是,我需要能夠過濾除給定的參數以外的東西。基本上,我想要做的是選擇客戶記錄,給定一個參數,如客戶名稱,選擇ID,然後將其用於派生表。我已經嘗試過Join,但派生表不在任何連接的範圍內。

任何想法?

+1

什麼版本的SQL Server?你也試過什麼樣的語法? –

+0

當你所有的數據都在'CustomerID'上被限制時,你只需要返回'Customer'字段? – Tony

回答

0

如果你是至少在SQL Server 2005(似乎從括號TOP表達有可能的),你可以使用公用表表達式,而不是派生表的。

/*Any previous statement must be terminated with a semi colon*/ 
WITH CurrentBalance 
    AS (SELECT TOP (1) Value, 
         Customer 
     FROM DebtBreakdown 
     WHERE (Customer = @CustomerID) 
       AND (Type = 0) 
     ORDER BY Timestamp DESC), /*Comma delimit CTE definitions*/ 
    Debt30Balance 
    AS (SELECT TOP (1) Value, 
         Customer 
     FROM DebtBreakdown AS DebtBreakdown_7 
     WHERE (Customer = @CustomerID) 
       AND (Type = 1) 
     ORDER BY Timestamp DESC) 
     /* ETC ETC */ 

您可以在同一查詢中多次引用CTE。