SQL Server中exists和not exists的妙用

请添加图片描述

事情的起因

在这里插入图片描述
力扣传送门

前言

这个题目其实还挺刁钻的,贴别是(lat,lon)是一个坐标,两个字段合成一个字段,然后,你得去给他们去重,当然咯,做题最重要的其实是审题,只有把题目的要求全部理解清楚了,那么才能完全写好解,这题作为exists用法的理解最合适不过了,估计这题很多方法都不如用exists

审题

这个题目主要有两个点,应该是找出tiv2015存在2条或者以上的数据,第二个就是lat和lon合在一起的时候要是整个数据里面唯一的

我的解
SELECT  CAST(round(SUM(tiv_2016 ),2) AS DECIMAL(18,2))   as tiv_2016 FROM Insurance WHERE pid IN(
SELECT a.pid FROM Insurance a LEFT JOIN Insurance b 
ON a.tiv_2015 =b.tiv_2015 where a.pid!=b.pid )
AND  lat  IN (SELECT lat FROM Insurance GROUP BY lat,lon HAVING COUNT(1)=1)
AND  lon  IN (SELECT lon  FROM Insurance GROUP BY lon,lat  HAVING COUNT(1)=1)
对自己解的分析

我其实写的很暴力,首先通过联表拿到所有tiv2015存在2条相等数据的pid,这个其实有不足奥,当时只想着相等的数据,我看到了个更好的是去分组tiv2015,只要它有2条数据或者以上,就可以去拿到所有的tiv2015,这样其实相当于拿到了所有的pid,那种写法会更简洁一点,然后在处理lat和lon我是直接暴力分组,相当于拿到所以去重过的(lat,lon)组合,然后再去挨个对他们进行处理,这里可以优化把公共语句提取用with包一下,整体写的还是比较偏暴力

最优解
select
round(sum(i1.tiv_2016),2 ) tiv_2016
from insurance i1 
where exists (
    select 
    i2.pid
    from insurance i2 where i2.pid != i1.pid and i2.tiv_2015 = i1.tiv_2015
)
and not exists (
    select 
    i2.lat, i2.lon
    from insurance i2 where i2.pid != i1.pid and i2.lat = i1.lat and i2.lon = i1.lon
)
对最优解的分析

首先通过exists拿到相当于tiv2015存在2条的数据然后再通过not exists去排除掉(lat,lon)组合存在2条的数据,确实这个处理,逻辑很明细,代码也比较整洁

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server的NOT EXISTS(不存在)用于在查询查找不满足指定条件的记录集。也就是说,它是一个用于判断条件是否满足的关键字。 NOT EXISTS是一种比较常见的SQL语句,在查询时使用可以有效地筛选掉不需要的数据,减轻数据库的负荷,提高查询效率。但是要注意,在使用NOT EXISTS进行查询时需要考虑查询的条件和目标数据表的关联关系,确保查询结果的准确性。 在使用NOT EXISTS时需要注意以下几个问题: 首先,要注意查询条件的选择。查询条件应该是针对目标数据表的记录集而非外部数据的记录集。否则会导致其它不满足条件的记录被误判为满足条件,从而影响查询结果的正确性。 其次,要注意目标数据表的索引设计。NOT EXISTS操作通常需要高效地匹配数据表的每一条记录,如果目标数据表的索引设计不合理,会导致全表扫描,降低查询效率。 最后,要注意并发性问题。当多个会话同时进行NOT EXISTS操作时,可能会发生竞态条件,导致查询结果的不稳定性,因此在操作之前需要进行锁定或使用事务控制来确保数据的一致性。 综上所述,SQL Server的NOT EXISTS操作是一个非常有用的关键字,可以用来判断查询条件是否满足,减少数据查询的负担,提高数据库查询效率。但是在使用时需要注意以上几个问题,避免操作失误和数据不一致的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值