之前在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