如果有一个包含数千个village的表,当然会有重复的。为了使用它们作为映射表,有必要对它们进行相应的标记。
表如下;
<表类>
id
国家
名称
notUnique
tbody><<tr>1234567 秘鲁 阿雷纳 空 1234568 墨西哥 阿雷纳 空 1234569 洪都拉斯 阿雷纳 空 1234570 美国 帕萨迪纳 空 1234571 加拿大道明> 萨迪纳 空 1234572 菲律宾 帕萨迪纳 空 1234573 波兰 Susk Nowy 空 表类>
正如@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;
我将在name
列上使用COLLATE
,以及存在的逻辑:
UPDATE Mapping.dbo.OsmGlobal o1
SET notUnique = 1
WHERE EXISTS (SELECT 1 FROM Mapping.dbo.OsmGlobal t2
WHERE t2.name COLLATE Latin1_General_CI_AI =
t1.name COLLATE Latin1_General_CI_AI AND
t2.id <> t1.id);
用简单的英语来说,上面的查询说,对于我们可以找到具有相同名称的任何记录(不同的id
),将notUnique
标志设置为1,如使用Latin1_General_CI_AI
进行整理。