SQL 存在子句连接键选择

问题描述 投票:0回答:1

我有这张桌子 表:保险

pid 是该表的主键(具有唯一值的列)。 该表的每一行都包含有关一项策略的信息,其中: pid 是投保人的保单 ID。 tiv_2015 是 2015 年的总投资值,tiv_2016 是 2016 年的总投资值。 lat 是投保人所在城市的纬度。保证 lat 不为 NULL。 lon 是投保人所在城市的经度。保证 lon 不为 NULL。

我想找到与任何其他保单持有人不在同一城市的 pid(即(纬度,经度)属性对必须是唯一的)。

我尝试使用exist子句来解决这个问题,因为我想学习如何使用它

这是示例表

pid tiv_2015 tiv_2016 纬度
1 10 5 10 10
2 20 20 20 20
3 10 30 20 20
4 10 40 40 40

如果我运行此查询

select pid, lat, lon
from insurance a
where exists 
(select lat, lon      
 from insurance b 
 where a.lat = b.lat 
 and a.lon = b.lon
 group by 1, 2 
 having count(*)= 1  
)

它返回正确答案

pid 纬度
1 10 10
4 40 40

但是如果我跑步

select pid, lat, lon
from insurance a
where exists 
(select lat, lon 
 from insurance b 
 where a.l=pid = b.pid
 group by 1, 2 
 having count(*)= 1 
)

它回来了

pid 纬度
1 10 10
2 20 20
3 20 20
4 40 40

这是不正确的

我不知道为什么使用唯一 ID 加入会给我错误的答案。我应该如何为 Exist 选择正确的连接密钥?

我找不到任何解释文档中存在的连接如何工作的内容

sql postgresql join exists
1个回答
0
投票

与:

select pid, lat, lon
from insurance a
where exists 
(select lat, lon      
 from insurance b 
 where a.lat = b.lat 
 and a.lon = b.lon
 group by 1, 2 
 having count(*)= 1  
)

您的意思是,对于每一行,检查所有具有相同纬度和经度的行,并且当按纬度、经度分组时,其计数为 1。这样就消除了具有相同纬度、经度计数大于 1 的行。

但是在第二条 SQL 中,您是通过 pid 进行匹配的。对于每一行,只有一个使用 pid(本身)的匹配项,因此 EXISTS 对于所有行都是 true,并且您会返回所有行。

© www.soinside.com 2019 - 2024. All rights reserved.