我在存儲過程中有一個臨時表。在SQL Server 2008 R2更新之前的有序數據
什麼我做的是獲取來自不同表中的數據,並使用
INSERT INTO #TempTable
SELECT * FROM t1
INNER JOIN t2 ON t1.ID = t2.ID
插入後其插入到臨時表,我需要更新一列。在更新臨時表之前,我想通過另一列對臨時表數據進行排序。
如何在臨時表上更新子句之前應用ORDER By
子句?
我在存儲過程中有一個臨時表。在SQL Server 2008 R2更新之前的有序數據
什麼我做的是獲取來自不同表中的數據,並使用
INSERT INTO #TempTable
SELECT * FROM t1
INNER JOIN t2 ON t1.ID = t2.ID
插入後其插入到臨時表,我需要更新一列。在更新臨時表之前,我想通過另一列對臨時表數據進行排序。
如何在臨時表上更新子句之前應用ORDER By
子句?
確保您的臨時表具有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
如果我用下面的查詢 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就不能保證工作。 –
你錯了。嘗試一下。很容易驗證。您的ID字段應按照您要訂購的列的順序進行計數。 –
ORDER BY子句應該如何影響你的UPDATE子句?因爲'ORDER BY'子句只是一個演示順序,但行存儲的順序並不重要。 'ORDER BY'子句不應該影響'UPDATE'子句。 –
一張桌子從來沒有訂單 - 你不能訂購一張桌子本身。只有**結果集**(來自'SELECT'的結果)才具有順序 - 如果指定了'ORDER BY'子句。 –
我的數據代表一個項目的大小,所以我需要安排或訂購數據,比如說0到100,然後更新另一列。如果數據沒有排序,那麼當我更新數據時,更新的值將是不正確的。 –