2012-11-07 95 views
0

我在存儲過程中有一個臨時表。在SQL Server 2008 R2更新之前的有序數據

什麼我做的是獲取來自不同表中的數據,並使用

INSERT INTO #TempTable 
    SELECT * FROM t1 
    INNER JOIN t2 ON t1.ID = t2.ID 

插入後其插入到臨時表,我需要更新一列。在更新臨時表之前,我想通過另一列對臨時表數據進行排序。

如何在臨時表上更新子句之前應用ORDER By子句?

+1

ORDER BY子句應該如何影響你的UPDATE子句?因爲'ORDER BY'子句只是一個演示順序,但行存儲的順序並不重要。 'ORDER BY'子句不應該影響'UPDATE'子句。 –

+2

一張桌子從來沒有訂單 - 你不能訂購一張桌子本身。只有**結果集**(來自'SELECT'的結果)才具有順序 - 如果指定了'ORDER BY'子句。 –

+0

我的數據代表一個項目的大小,所以我需要安排或訂購數據,比如說0到100,然後更新另一列。如果數據沒有排序,那麼當我更新數據時,更新的值將是不正確的。 –

回答

0

確保您的臨時表具有IDENTITY字段。通過您的初始插入

CREATE TABLE #TempTable 
(
    ID int identity(1,1) primary key 
    ... 
) 

把一個順序: -

INSERT INTO 
    #TempTable 
SELECT * FROM t1 
INNER JOIN 
    t2 
ON t1.ID = t2.ID 
ORDER BY [Your Field] 

理由: - 有些人可能認爲把身份字段中是不必要的,或者確實是該行的順序在臨時表中是不重要的。我不同意。

首先,帶有ID字段,可以執行連接,如: -

SELECT 
    t1.*, t2.SpecificThing 
FROM 
    #TempTable t1 
INNER JOIN 
    #TempTable t2 
ON t1.ID = (t2.ID + 1) 

哪些可以很方便對任何運行總/累積技巧。

至於在臨時表中排序不重要,我不同意 - 至少在SQL Server。 SQL Server上的UPDATE語句以的順序更新行。如果沒有,這個令人着迷(並且非常快速)的運行總計絕不會奏效。

CREATE TABLE #CustomerInfo 
(
    ID int identity(1,1) primary key, 
    CustomerId int, 
    SaleValue money, 
    RunningTotal money 
) 

-- Assume customer is populated 

DECLARE @RunningTotal decimal(18,4) 
DECLARE @CustomerId INT 

SELECT @CustomerId = CustomerId FROM #CustomerInfo WHERE Id = 1 
SET @RunningTotal = 0 

-- This only works in SQL Server because under the hood, the engine is updating 
-- iteratively in order. 
-- 
-- Starts at row 0, then row 1 - with each row the value of @RunningTotal 
-- is reassigned. 
UPDATE #CustomerInfo 
SET 
    @RunningTotal = 
    RunningTotal = 
    CASE WHEN 
     -- Are we still looking at the same customer? 
     @CustomerId = CustomerId 
    THEN 
    -- Yes. Add sale value to @RunningTotal 
    @RunningTotal + SaleValue 
    ELSE 
    -- No, reset @RunningTotal to SaleValue of this row 
    SaleValue 
    END 
    ,@CustomerId = CustomerId 
FROM #CustomerInfo 
+0

如果我用下面的查詢 INSERT INTO #TempTable SELECT * FROM T1 INNER JOIN T2 ON t1.ID = t2.ID ORDER BY [你的領域] 我不事ORDER BY子句工作becoz ORDER BY作品正確地選擇語句而不是視圖,派生表,子查詢等等。如果我們這樣使用order by clause,那麼ORDER BY就不能保證工作。 –

+0

你錯了。嘗試一下。很容易驗證。您的ID字段應按照您要訂購的列的順序進行計數。 –