我正在尝试编写一个查询来检测 PostgreSQL 表中可能无效的数据。我们有一个这样的城市名称表:
# `city_names`
id | name | language | dialect | city_id
------------------------------------------------
01 | London | A | A1 | 1
02 | London | A | A2 | 1
03 | London | B | B1 | 2
04 | London | B | B2 | 3
在我们的领域:
- 第 01 行和第 02 行都将“伦敦”映射到城市 1 没问题;方言不会碰巧不同
- 第 03 行将“伦敦”映射到城市 2 没问题;在那种语言中,这个名字可能指代不同的城市
- 第 04 行将“伦敦”映射到城市 3 是可疑的,因为我们已经用相同的语言映射到城市 2
我想编写一个仅选择行 03 和 04 的查询,以便人们可以确定其中一个是否指向错误的城市。
我可以在程序上解决这个问题,但我在 SQL 中遇到了麻烦。例如,如果我GROUP BY
使用语言和姓名,我将丢失city_id
各个行的值。
基本上我的目标是:“如果同一个名字和语言有多个 city_id,列出那些 city_id。”
我怎样才能做到这一点?
这个查询就可以了。诀窍是使用
COUNT(DISTINCT city_id)
:SQL小提琴
PostgreSQL 8.3.20 架构设置:
查询 1:
结果: