SQL EXISTS子句关联键选择问题:主键关联为何结果错误?
关于EXISTS子句关联键选择的问题解析
关联主键pid返回全部数据的原因
pid是表的主键,每一行的pid都是唯一的。当你用EXISTS (SELECT 1 FROM Insurance i2 WHERE i2.pid = i.pid)时,子查询针对每一行的i.pid,必然能找到对应的i2.pid(主键的唯一性保证了这一点),所以每一行的EXISTS判断结果都是TRUE,最终返回表中所有pid,完全不符合筛选坐标唯一的需求。
用lat、lon关联的正确逻辑
要筛选出(lat,lon)坐标唯一的保单,核心是判断当前行的坐标组合没有其他行重复。对应的EXISTS写法应该是:
SELECT pid FROM Insurance i WHERE NOT EXISTS ( SELECT 1 FROM Insurance i2 WHERE i2.lat = i.lat AND i2.lon = i.lon AND i2.pid != i.pid );
这段SQL的逻辑是:对于当前行的(lat,lon),不存在其他行和它拥有相同的坐标但不同的pid,也就意味着这个坐标组合只出现一次。
EXISTS关联键的正确选择原则
- 锚定需求的核心维度:你的需求是基于坐标的唯一性,所以必须选择
lat和lon作为关联键,因为这两个字段是判断重复的核心依据,主键pid和坐标唯一性无关。 - 明确子查询的判断目标:EXISTS的作用是判断子查询是否存在符合条件的结果。要筛选无重复的坐标,就要关联坐标字段,同时通过
i2.pid != i.pid排除当前行自身,避免误判。 - 杜绝无关字段关联:不要用和需求无关的字段(比如这里的pid)关联子查询,否则会因为字段本身的唯一性导致逻辑完全偏离预期。
内容的提问来源于stack exchange,提问作者Fan Chen
相关产品推荐
相关产品推荐

