EXISTS 在SQL 中的用法

Exists在sql server 中是重要的关键字,可以使得一些查询的效率更高。

在项目中遇见到查询有报价的地区信息和查询没有报价的地区信息,当时我用了INNER JOIN来实现,发现当数据量达到千万级后效率很差,后改为Exists关键字实现,效率提高不少。

查询有报价的地区信息:

sql_1
1  SELECT  mm.ID,  mm.CnName FROM MD_AreaInfo mm INNER  JOIN MD_Prices pp ON mm.ID = pp.AreaID  GROUP BY mm.ID, mm.CnName

用exists关键字实现:

SQL_2
1  SELECT mm.ID,mm.CnName FROM MD_AreaInfo mm WHERE EXISTS(SELECT 0 FROM MD_Prices pp WHERE pp.AreaID = mm.ID)

查询没有报价的地区信息:

sql_3
1  SELECT mm.ID,mm.CnName FROM MD_AreaInfo mm WHERE NOT EXISTS(SELECT 0 FROM MD_Prices pp WHERE pp.AreaID = mm.ID)

用LEFT JOIN实现:

sql_4
1  SELECT mm.ID,mm.CnName FROM MD_AreaInfo mm LEFT JOIN MD_Prices pp ON mm.ID = pp.AreaID WHERE pp.AreaID IS NULL

通过上面看到在 sql_1中为了去掉重复行,用group by进行分组,而exists中就不需要用group by进行分组或则 distinct;原因是用exists关键时候不需要一行一行的进行链接,而是需找记录,知道找到第一个匹配的记录,停止在那里。只要有一个匹配,Exists就为真。

下面利用Exists关键字实现数据的批量更新和批量插入:


有三条数据:

现在需要往这个表中插入7条数据,如果有相同记录 (Areaid,TypeID,UNID相同),经行更新,否则,执行插入

数据及sql语句如下:

Update INSERT
CREATE TYPE Ty_PriceSubMitList AS TABLE(
AreaID INT,
TypeID INT,
UNID INT
)
declare @dt Ty_PriceSubMitList;
INSERT INTO @dt VALUES(1,1,148);
INSERT INTO @dt VALUES(1,2,148);
INSERT INTO @dt VALUES(1,3,148);
INSERT INTO @dt VALUES(1,5,148);
INSERT INTO @dt VALUES(1,6,1706);
INSERT INTO @dt VALUES(2,1,148);
INSERT INTO @dt VALUES(2,6,148);
UPDATE pp SET pp.UpdateTime= GETDATE() FROM PriceSubmitList pp,@dt tt WHERE pp.AreaId = tt.AreaID AND pp.TypeId = tt.TypeID AND pp.UNID = tt.UNID;
INSERT INTO PriceSubmitList(AreaId,TypeId,UNID,UpdateTime) SELECT AreaId,TypeId,UNID,GETDATE() FROM @dt tt WHERE NOT EXISTS(SELECT 0 FROM PriceSubmitList pp WHERE pp.AreaId = tt.AreaId AND pp.TypeId=tt.TypeID AND pp.UNID=tt.UNID)
原文地址:https://www.cnblogs.com/hfliyi/p/2370589.html