Sql 重新创建所有授权/同义词/触发器/索引/FKs/。。。(或截断原始文件并从新文件中插入或选择)
显然,这会带来相当大的开销,但如果您想更新/清除数百万行,这将是最快的方法。我对使用的语法理解不够透彻,无法给出准确的答案,但这里有一种方法 确定要保留的行(例如,选择值,…from..where…) 识别时执行更新逻辑(例如,选择值+1…从…何处…) 不要将select插入到新表中 删除原始文件,将新文件重命名为原始文件,重新创建所有授权/同义词/触发器/索引/FKs/。。。(或截断原始文件并从新文件中插入或选择)Sql 重新创建所有授权/同义词/触发器/索引/FKs/。。。(或截断原始文件并从新文件中插入或选择),sql,sql-update,temp-tables,Sql,Sql Update,Temp Tables,显然,这会带来相当大的开销,但如果您想更新/清除数百万行,这将是最快的方法。我对使用的语法理解不够透彻,无法给出准确的答案,但这里有一种方法 确定要保留的行(例如,选择值,…from..where…) 识别时执行更新逻辑(例如,选择值+1…从…何处…) 不要将select插入到新表中 删除原始文件,将新文件重命名为原始文件,重新创建所有授权/同义词/触发器/索引/FKs/。。。(或截断原始文件并从新文件中插入或选择) 显然,这会带来相当大的开销,但如果您想更新/清除数百万行,这将是最快的方法。同
显然,这会带来相当大的开销,但如果您想更新/清除数百万行,这将是最快的方法。同意,虽然TSQL包含循环,但它没有针对循环进行优化。如果这是特定于Microsoft SQL server的,请标记为SQL server。要么这样,要么我就放弃,忽略标记SQL。同意,虽然TSQL包含循环,但它并没有针对循环进行优化。如果这是特定于Microsoft SQL server的,请标记为SQL server。要么这样,要么我就放弃,忽略标记SQL。
CREATE TABLE #tmp_ImportedData_GenericData
(
Id int identity(1,1),
tmpCode varchar(255) NULL,
tmpAlpha3Code varchar(50) NULL,
tmpRelatedYear int NOT NULL,
tmpPreviousValue varchar(255) NULL,
tmpGrowthRate varchar(255) NULL
)
INSERT INTO #tmp_ImportedData_GenericData
SELECT
MCS_ImportedData_GenericData.Code,
MCS_ImportedData_GenericData.Alpha3Code,
MCS_ImportedData_GenericData.RelatedYear,
MCS_ImportedData_GenericData.PreviousValue,
MCS_ImportedData_GenericData.GrowthRate
FROM MCS_ImportedData_GenericData
INNER JOIN
(
SELECT CODE, ALPHA3CODE, RELATEDYEAR, COUNT(*) AS NUMROWS
FROM MCS_ImportedData_GenericData AS M
GROUP BY M.CODE, M.ALPHA3CODE, M.RELATEDYEAR
HAVING count(*) > 1
) AS M2 ON MCS_ImportedData_GenericData.CODE = M2.CODE
AND MCS_ImportedData_GenericData.ALPHA3CODE = M2.ALPHA3CODE
AND MCS_ImportedData_GenericData.RELATEDYEAR = M2.RELATEDYEAR
WHERE
(MCS_ImportedData_GenericData.PreviousValue <> 'INDEFINITO')
-- SELECT * from #tmp_ImportedData_GenericData
-- DROP TABLE #tmp_ImportedData_GenericData
DECLARE @counter int
DECLARE @rowsCount int
SET @counter = 1
SELECT @rowsCount = count(*) from #tmp_ImportedData_GenericData
-- PRINT @rowsCount
WHILE @counter < @rowsCount
BEGIN
SELECT
@Code = tmpCode,
@Alpha3Code = tmpAlpha3Code,
@RelatedYear = tmpRelatedYear,
@OldValue = tmpPreviousValue,
@GrowthRate = tmpGrowthRate
FROM
#tmp_ImportedData_GenericData
WHERE
Id = @counter
DELETE FROM MCS_ImportedData_GenericData
WHERE
Code = @Code
AND Alpha3Code = @Alpha3Code
AND RelatedYear = @RelatedYear
AND PreviousValue <> 'INDEFINITO' OR PreviousValue IS NULL
UPDATE
MCS_ImportedData_GenericData
SET
PreviousValue = @OldValue, GrowthRate = @GrowthRate
WHERE
Code = @Code
AND Alpha3Code = @Alpha3Code
AND RelatedYear = @RelatedYear
AND MCS_ImportedData_GenericData.PreviousValue ='INDEFINITO'
SET @counter = @counter + 1
END
WITH q AS (
SELECT m.*, ROW_NUMBER() OVER (PARTITION BY CODE, ALPHA3CODE, RELATEDYEAR ORDER BY CASE WHEN PreviousValue = 'INDEFINITO' THEN 1 ELSE 0 END)
FROM MCS_ImportedData_GenericData m
WHERE PreviousValue <> 'INDEFINITO'
)
DELETE
FROM q
WHERE rn > 1
DELETE
[data]
FROM
MCS_ImportedData_GenericData AS [data]
WHERE
id > (
SELECT
MIN(id)
FROM
MCS_ImportedData_GenericData
WHERE
CODE = [data].CODE
AND ALPHA3CODE = [data].ALPHA3CODE
AND RELATEDYEAR = [data].RELATEDYEAR
)
DELETE
[data]
FROM
MCS_ImportedData_GenericData AS [data]
INNER JOIN
(
SELECT
MIN(id) AS [id],
CODE,
ALPHA3CODE,
RELATEDYEAR
FROM
MCS_ImportedData_GenericData
GROUP BY
CODE,
ALPHA3CODE,
RELATEDYEAR
)
AS [original]
ON [original].CODE = [data].CODE
AND [original].ALPHA3CODE = [data].ALPHA3CODE
AND [original].RELATEDYEAR = [data].RELATEDYEAR
AND [original].id <> [data].id