首页 > 解决方案 > 行总和和不区分大小写

问题描述

通过拥有一张包含数千个村庄的桌子,当然会有重复。为了将它们用作映射表,有必要相应地标记它们。

表如下所示;

ID 国家 姓名 不是唯一的
1234567 秘鲁 阿雷纳尔 无效的
1234568 墨西哥 阿雷纳尔 无效的
1234569 洪都拉斯 阿雷纳尔 无效的
1234570 美国 帕萨迪纳 无效的
1234571 加拿大 帕萨迪纳 无效的
1234572 菲律宾 帕萨迪尼亚 无效的
1234573 波兰 苏斯克现在 无效的

现在我使用我的代码片段来填写非唯一:

-- generate RowSum:
update
    Mapping.dbo.OsmGlobal
set
    notUnique = 1
from
    Mapping.dbo.OsmGlobal osm
 join   (
        SELECT [name], COUNT([name]) RowSum
        FROM Mapping.dbo.OsmGlobal osm
        Group by [name]
        ) cnt
    on osm.[name] = cnt.[name]
where cnt.RowSum > 1
go

显然它会导致下面的结果,因为没有不区分大小写;

ID 国家 姓名 不是唯一的
1234567 秘鲁 阿雷纳尔 1
1234568 墨西哥 阿雷纳尔 1
1234569 洪都拉斯 阿雷纳尔 1
1234570 美国 帕萨迪纳 1
1234571 加拿大 帕萨迪纳 1
1234572 菲律宾 帕萨迪尼亚 无效的
1234573 波兰 苏斯克现在 无效的

为了在“Pasadena”的结果组中包含“Pasadeña”,我尝试添加一个collate Latin1_General_CI_AI. 这就是我失败的地方。非常欢迎任何帮助。

标签: sql-server

解决方案


正如@TimBiegeleisen 所述,您应该使用不区分大小写的排序规则。

但是您可以使用可更新的 CTE 更简单地做到这一点

WITH osm AS (
    SELECT *,
      COUNT(*) OVER (PARTITION BY (name COLLATE Latin1_General_CI_AI)) RowSum
    FROM Mapping.dbo.OsmGlobal osm
)
UPDATE osm
SET
    notUnique = 1
WHERE osm.RowSum > 1;

推荐阅读