2013年9月23日 星期一

[T-SQL]CTE也可以用來簡化你的UPDATE喔

        CTE一般說來都拿來參考用,也就是拿來Join,但我不知道竟然可以直接拿來Update呢,而不用Join喔,第一次看到有人這樣用我還很驚訝,心想怎麼不需JOIN呢?

        不多說,直接看例子吧


USE [AdventureWorks2012];

IF OBJECT_ID('dbo.T1', 'U') IS NOT NULL DROP TABLE dbo.T1;

GO

CREATE TABLE dbo.T1
(
     col1 INT NULL,
     col2 VARCHAR(10) NOT NULL
);

INSERT INTO dbo.T1(col2)
VALUES('A'),('B'),('C'),('D'),('E'),('F');

SELECT * FROM dbo.T1;

        怎麼依col2排序編col1流水號呢?

        以前我會這樣,用參考CTE的,然後Update目標資料表T1


WITH CTE AS
(
     SELECT
         col2,
         ROW_NUMBER() OVER(ORDER BY col2) AS ROWNUM
     FROM dbo.T1
)
UPDATE T1
SET col1 = ROWNUM
FROM T1 INNER JOIN CTE ON T1.col2 = CTE.col2;



        現在我會用直接Update CTE的,不需JOIN,結果也會一樣

WITH CTE AS
(
     SELECT
         col1,
         col2,
         ROW_NUMBER() OVER(ORDER BY col2) AS ROWNUM
     FROM dbo.T1
)
UPDATE CTE
SET col1 = ROWNUM;


        來比較兩個執行計畫的成本,如下圖,用Join CTE的要68%,而不Join直接Update CTE的只要32%,優劣立判,可以直接Update CTE是不是很方便呀!


       

0 意見:

張貼留言