【问题标题】:Adding Collation to a SQL Server CTE statement将排序规则添加到 SQL Server CTE 语句
【发布时间】:2015-08-27 08:54:39
【问题描述】:

我正在尝试确定如何将 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  

关于如何实现这一点的任何想法?

【问题讨论】:

    标签: sql-server tsql collation


    【解决方案1】:

    我看到您错过了在子查询中选择 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  
    

    【讨论】:

    • 对不起,我遗漏了一些代码,请参阅更新 OP WHERE DuplicateCount > 1
    【解决方案2】:

    鉴于您正在删除,您不需要选择除分区以外的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 和分区中重复整理,您可以使用前面的 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; 
    

    Fiddle

    【讨论】:

    • 对不起,我遗漏了一些代码,请参阅更新 OP WHERE DuplicateCount > 1
    • 您的原始查询看起来是正确的 - 您不能在使用它的同一查询中按窗口函数投影的 row_number 值进行过滤 - CTE 上的外部过滤器将删除其他所有重复的行比第一个。
    • 是的,我看到了问题,事实上我想在 SELECT 上添加另一个过滤器。我可以让 ORDER BY 按 DuplicateCount 排序,但它不会应用 WHERE 条件。如果我添加除 ROW_NUMBER 之外的其他字段,我可以使用 WHERE 进行过滤吗?
    • 表上的另一个字段 = 是,但如果是另一个派生列、聚合等,那么您需要在另一个 cte 或派生表中进行预投影(类似于第二个示例collated 预过滤器 cte)。
    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2012-06-08
    • 2010-10-07
    • 2020-12-16
    • 2012-01-21
    • 2014-08-15
    • 1970-01-01
    相关资源
    最近更新 更多