将排序规则添加到 SQL 服务器 CTE 语句
Adding Collation to a SQL Server CTE statement
我正在尝试确定如何将 COLLATION 添加到此操作....
WITH CTE (srtTxt, DuplicateCount)
AS
(
SELECT
srtTxt,
ROW_NUMBER() OVER(PARTITION BY srtTxt ORDER BY ID) AS DuplicateCount
FROM dbo.tblLang
**WHERE DuplicateCount > 1**
)
DELETE
FROM CTE
WHERE DuplicateCount > 1
GO
这是我要应用的设置...
COLLATE Latin1_General_CS_AS srtTxt
我已经尝试过像这样的各种改变....
WITH CTE (srtTxt, DuplicateCount)
AS
(
SELECT
srtTxt,
ROW_NUMBER() OVER(PARTITION BY srtTxt ORDER BY ID) AS DuplicateCount
FROM
(SELECT srtTxt COLLATE Latin1_General_CS_AS AS srtTxt
FROM dbo.tblLang) AS T
**WHERE DuplicateCount > 1**
)
DELETE
FROM CTE
WHERE DuplicateCount > 1
GO
关于如何实现这个的任何想法?
我看到您在子查询中遗漏了 select ID
也请添加ID如下
;WITH CTE (srtTxt, DuplicateCount)
AS (
SELECT
srtTxt,
ROW_NUMBER() OVER(PARTITION BY srtTxt ORDER BY ID) AS DuplicateCount
FROM (
SELECT
ID, srtTxt COLLATE Latin1_General_CS_AS AS srtTxt
FROM dbo.tblLang
) AS T
)
DELETE
FROM CTE
WHERE DuplicateCount > 1
GO
鉴于您正在删除,除了分区之外,您不需要select srtTxt
,所以只需要:
WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY srtTxt COLLATE Latin1_General_CS_AS
ORDER BY ID) AS DuplicateCount
FROM dbo.tblLang
)
DELETE
FROM CTE
WHERE DuplicateCount > 1;
但是,如果您确实还需要 select 重新整理的字段,为了防止在 Select
和分区中重复整理,您可以使用前面的 DRY this up CTE:
WITH Collated AS
(
SELECT ID, srtTxt COLLATE Latin1_General_CS_AS srtTxt
FROM dbo.tblLang
),
Duplicates(srtTxt, DuplicateCount)
AS
(
SELECT srtTxt,
ROW_NUMBER() OVER(PARTITION BY srtTxt ORDER BY ID) AS DuplicateCount
FROM Collated
)
DELETE
FROM Duplicates
WHERE DuplicateCount > 1;
我正在尝试确定如何将 COLLATION 添加到此操作....
WITH CTE (srtTxt, DuplicateCount)
AS
(
SELECT
srtTxt,
ROW_NUMBER() OVER(PARTITION BY srtTxt ORDER BY ID) AS DuplicateCount
FROM dbo.tblLang
**WHERE DuplicateCount > 1**
)
DELETE
FROM CTE
WHERE DuplicateCount > 1
GO
这是我要应用的设置...
COLLATE Latin1_General_CS_AS srtTxt
我已经尝试过像这样的各种改变....
WITH CTE (srtTxt, DuplicateCount)
AS
(
SELECT
srtTxt,
ROW_NUMBER() OVER(PARTITION BY srtTxt ORDER BY ID) AS DuplicateCount
FROM
(SELECT srtTxt COLLATE Latin1_General_CS_AS AS srtTxt
FROM dbo.tblLang) AS T
**WHERE DuplicateCount > 1**
)
DELETE
FROM CTE
WHERE DuplicateCount > 1
GO
关于如何实现这个的任何想法?
我看到您在子查询中遗漏了 select ID 也请添加ID如下
;WITH CTE (srtTxt, DuplicateCount)
AS (
SELECT
srtTxt,
ROW_NUMBER() OVER(PARTITION BY srtTxt ORDER BY ID) AS DuplicateCount
FROM (
SELECT
ID, srtTxt COLLATE Latin1_General_CS_AS AS srtTxt
FROM dbo.tblLang
) AS T
)
DELETE
FROM CTE
WHERE DuplicateCount > 1
GO
鉴于您正在删除,除了分区之外,您不需要select srtTxt
,所以只需要:
WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY srtTxt COLLATE Latin1_General_CS_AS
ORDER BY ID) AS DuplicateCount
FROM dbo.tblLang
)
DELETE
FROM CTE
WHERE DuplicateCount > 1;
但是,如果您确实还需要 select 重新整理的字段,为了防止在 Select
和分区中重复整理,您可以使用前面的 DRY this up CTE:
WITH Collated AS
(
SELECT ID, srtTxt COLLATE Latin1_General_CS_AS srtTxt
FROM dbo.tblLang
),
Duplicates(srtTxt, DuplicateCount)
AS
(
SELECT srtTxt,
ROW_NUMBER() OVER(PARTITION BY srtTxt ORDER BY ID) AS DuplicateCount
FROM Collated
)
DELETE
FROM Duplicates
WHERE DuplicateCount > 1;