我有这张桌子 表:保险
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 选择正确的连接密钥?
我找不到任何解释文档中存在的连接如何工作的内容
与:
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,并且您会返回所有行。