通過擁有一張包含數千個村莊的桌子,當然會有重復的。為了將它們用作映射表,必須相應地標記它們。
表格如下所示;
| ID | 國家 | 姓名 | 不唯一 |
|---|---|---|---|
| 1234567 | 秘魯 | 阿雷納爾 | 空值 |
| 1234568 | 墨西哥 | 阿雷納爾 | 空值 |
| 1234569 | 洪都拉斯 | 阿雷納爾 | 空值 |
| 1234570 | 美國 | 帕薩迪納 | 空值 |
| 1234571 | 加拿大 | 帕薩迪納 | 空值 |
| 1234572 | 菲律賓 | 帕薩迪納 | 空值 |
| 1234573 | 波蘭 | Susk Nowy | 空值 |
現在我使用我的代碼片段來填寫不唯一:
-- 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 | 波蘭 | Susk Nowy | 空值 |
為了在“Pasadena”的結果組中包含“Pasade?a”,我嘗試添加一個collate Latin1_General_CI_AI. 這就是我失敗的地方。任何幫助都非常受歡迎。
uj5u.com熱心網友回復:
我會COLLATE在name列上使用,以及存在邏輯:
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);
用簡單的英語,上面的查詢表示將notUnique任何記錄的標志設定為 1,我們可以找到另一條id具有相同名稱的記錄(不同的),如使用Latin1_General_CI_AI.
uj5u.com熱心網友回復:
正如@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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323655.html
標籤:sql-server
上一篇:僅獲取每個名稱具有最新日期的行
