我有两张桌子需要连接在一起。但是,我只想在有 unqiue 匹配时加入记录,而不是选择几个中的一个进行加入。
版本控制:
使用 MariaDB 版本 10.3.34
示例数据:
核心(左)数据towns
ID | 镇 | 邮政编码 |
---|---|---|
1 | 哈德菲尔德 | HD11 4ER |
2 | 曼彻斯特 | MN14 3JE |
3 | 麦克尔斯菲尔德 | MK17 9FL |
4 | 爱丁堡 | ED5 3MJ |
5 | 利物浦 | LV9 8XT |
加入(右)数据peoples
:
ID | 名字 | 邮政编码 |
---|---|---|
1 | 吉米萨维尔 | HD11 4ER |
2 | 杰森炸弹 | IP14 8FK |
3 | 米奇老鼠 | MK17 9FL |
4 | 鲍比·迪里安 | ED5 3MJ |
5 | 莱尼戴维斯 | ED5 3MJ |
我的 SQL:
我的初始查询将类似于:
SELECT towns.id, towns.town, peoples.name FROM towns
LEFT JOIN people ON towns.postcode = peoples.postcode
但这将包括Edinburgh
但爱丁堡有两个人,我只想在有一个单独的行加入时加入。
我使用 LEFT 连接,因为我需要返回所有towns
但只返回唯一的peoples
.
预期成绩:
ID | 镇 | 名字 |
---|---|---|
1 | 哈德菲尔德 | 吉米萨维尔 |
2 | 曼彻斯特 | <null> |
3 | 麦克尔斯菲尔德 | 米奇老鼠 |
4 | 爱丁堡 | <null> |
5 | 利物浦 | <null> |
我试过的
我已经尝试COUNT()
在 JOIN 中使用,但无法使其正常工作,
SELECT towns.id, towns.town, peoples.names FROM towns
LEFT JOIN people ON towns.postcode = peoples.postcode AND count(peoples.id) = 1
出现语法错误。
我想不出我如何才能限定这个只有在找到一个结果时才加入的加入。互联网搜索给了我很多更模糊和离题的参考。
我敢肯定这很简单,但我做不到。另外,如果可能的话,我想避免子查询?
Lennart 的窗口函数答案的另一种方法是仅对表使用
GROUP BY
andHAVING
子句peoples
来过滤掉具有相同的子句,如下所示postcode
:你应该能够离开加入人民:
IE
编辑:
鉴于更新中提供的 ddl 我创建了db<>fiddle
它似乎给出了预期的结果
更简单:
我相信它避免了之前评论中提到的“唯一完整的分组依据”问题。(如果没有,请参阅此答案的评论。)
看,妈妈,没有子查询和聚合或窗口函数!