T-SQL查詢:CTE - with as 子句的特殊應用

之前在2本書看到過with as 子句的一個簡單例子,網上沒找到相關資料。

今天想起總結一下,主要說明如下:

【大表分批更新】

【大表分批刪除】

【完全重複的行只保留一行】


 
--創建測試表
--	DROP TABLE [tabName]
SELECT * INTO [tabName] FROM sys.objects
 
 
SELECT * FROM [databaseName].[dbo].[tabName] ORDER BY name desc

【大表分批更新】
網頁需要升級的時候,數據庫需要增加字段或者更新字段值,對於大表將堵塞很久。
一般先增加字段允許爲null值,再更新表中默認值,再添加約束
比如要將測試表的principal_id更新爲0,以下用最簡單的可行的方法更新:

;WITH TAB AS(
	SELECT TOP 10 principal_id FROM [dbo].[tabName] where principal_id is null
)update TAB set principal_id = 0

要更新字段principal_id就只取一個。每次選擇前10行更新null爲0,可以創建定時作業更新。



【大表分批刪除】
對於一些數據維護需要刪除較多的數據,而表較大並且很多用戶還在使用中。
一般創建一個作業在晚上執行刪除,或者按某個字段分段刪除。
更方便的方法也可以選擇符合的條件刪除前N行

;WITH TAB AS(
	SELECT TOP 10 principal_id FROM [dbo].[tabName] where principal_id is null
)DELETE FROM TAB


【完全重複的行只保留一行】

–插入使產生重複行

INSERT INTO [tabName]
SELECT TOP 50 PERCENT * FROM [databaseName].[dbo].[tabName]
 
 
SELECT * FROM [databaseName].[dbo].[tabName] ORDER BY name desc

網上使用最多的案例,都指定某列肯定是唯一的,以此來用一個語句刪除其他重複的。
對於完全相同的行,大都表示創建一個臨時表來過渡操作。
以下使用“with 子句 和 ROW_NUMBER()函數”來實現刪除完全重複的其他行
,partition分組時可以選擇一列(或所有列)進行分組排序

;WITH TAB AS(
	SELECT ROW_NUMBER()over(partition by object_id order by (select 0)) id
	FROM [dbo].[tabName]
)DELETE FROM TAB WHERE ID>1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章