0

ストアド プロシージャ内に一時テーブルがあります。

私がやっていることは、別のテーブルからデータをフェッチし、それを一時テーブルに挿入することです

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

挿入後、1 つの列を更新する必要があります。一時テーブルを更新する前に、一時テーブルのデータを別の列で並べ替えたいと思います。

ORDER By一時テーブルの更新句の前に句を適用するにはどうすればよいですか?

4

1 に答える 1

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 フィールドを入れる必要はないと主張する人もいれば、一時テーブルの行の順序は重要ではないと主張する人もいます。私は同意しません。

まず、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 
于 2012-11-07T13:40:47.760 に答える