zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    shell 指定范围产生随机数
    shell脚本比较两个数大小
    Shell 脚本实现随机抽取班级学生
    linux通过挂载系统光盘搭建本地yum仓库的方法
    kuberenetes 上使用helm部署rancher如何卸载干净
    Windows 下 左Ctrl和Caps交换
    C#笔记 -- 协变、逆变
    Python 读取window下UTF-8-BOM 文件
    生成命令行程序使用脚本
    ffmpeg 命令小记
  • 原文地址:https://www.cnblogs.com/hfliyi/p/2370589.html
Copyright © 2011-2022 走看看