Ø集合操作

来源:互联网 发布:网络金庸群侠传 编辑:程序博客网 时间:2024/05/21 22:42

UNION:将多个查询的结果组合到一个查询结果之中,没有重复内容;

UNION ALL:跟UNION一样,但是包含重复值;

INTERSECT:返回多个查询结果中相同的部分;

MINUS:返回两个查询结果的差集;

UNION,UNION  ALL 区别SQL体现

SELECT 'UNION_COUNT' TYPE, COUNT(1) QTY

  FROM (SELECTA.PROD_ID, A.PROD_NAME FROM TB_PROD_MAS A

        UNION

        SELECTB.PROD_ID, B.PROD_NAME FROM TB_PROD_UNIT B)

UNION

SELECT 'UNION_ALL_COUNT' TYPE, COUNT(1) QTY

  FROM (SELECTA.PROD_ID, A.PROD_NAME FROM TB_PROD_MAS A

        UNION ALL

        SELECTB.PROD_ID, B.PROD_NAME FROM TB_PROD_UNIT B)

以下INTERSECTMINUS两句SQL怎么理解?从业务层面理解,很多时候我们是从业务来写SQL,但我今天问从SQL能够想到的业务;

SELECT A.STATE_ID FROM TB_STATE A

INTERSECT

SELECT B.STATE_ID FROM TB_CITY B;

SELECT A.STATE_ID FROM TB_STATE A

MINUS

SELECT B.STATE_ID FROM TB_CITY B;



UINON,UINON ALL适用场景;

        1:对于有继承关系的表数据,如下面两个示例

         商品质检项继承分类质检项,查询出该商品所有质检项。

SELECT  *

      FROMTB_SIP_ITEM

      WHEREQC_TYPE_ID IN(

        SELECTB.QC_TYPE_ID

        FROMTB_SIP_MAS B

        WHEREB.PROD_ID = 205763

        AND B.Ver= 1

        UNION ALL

        SELECTC.EXT_QC_TYPE_ID

        FROMTB_SIP_MAS C

        WHEREC.PROD_ID = 205763

        ANDC.VER= 1

        ANDEXT_QC_TYPE_ID IS NOT NULL

      );

     查询第三级分类属性以及继承上级分类属性列表;

SELECT *

  FROMTB_EXPL_BAS A

 WHERE A.CATE_ID= 1984

UNION

SELECT *

  FROMTB_EXPL_BAS B

 WHERE B.CATE_ID=

       (SELECTC.CATE_PID FROM TB_PROD_CATE C WHERE C.CATE_ID = 1984)


2:对于同一对象数据,拆分成多个表的情况,要取所有数据。如省市县,

              商品大中 小分类有的系统设计为三个表。

SELECT TS.STATE_ID ADDR_ID,'0' ADDR_PID, '1'LVL_NUM ,TS.STATE_NM

ADDR_NAME,TS.USE_YN USE_YN FROM TB_STATE TS

UNION

SELECT TC.CITY_ID ADDR_ID,TC.STATE_IDADDR_PID, '2' LVL_NUM ,TC.CITY_NM

ADDR_NAME,TC.USE_YN USE_YN FROM TB_CITY TCWHERE TC.STATE_ID>0

UNION

SELECT TT.TOWN_ID ADDR_ID,TT.CITY_ID ADDR_PID,'3' LVL_NUM ,TT.TOWN_NM

ADDR_NAME,TT.USE_YN USE_YN FROM TB_TOWN TTWHERE TT.CITY_ID>0

ORDER BY LVL_NUM,ADDR_ID

INTERSECT,MINUS适用场景;

        1:经常对于提交一个列表(List集合)的数据,在界面上这个列表数据有可能删除,有可能增加,如角色授权功能画面。用记在操作时可能去掉以前授权的功能,以及添加一些新功能权限,一般的处理方式是先全部DELETE,再INSERT。但我一般不采用这种方式,我的想法是:删除在界面上取消的,增加在数据中不存在的。这个用MINUS很好实现。

DELETE  FROMTB_SYS_ROLE_MENU

  WHERE(A.ROLE_ID, A.MENU_ID)

    IN (   SELECT B.ROLE_ID, B.MENU_ID

             FROMTB_SYS_ROLE_MENU B

            WHEREB.ROLE_ID = 85

            MINUS

           SELECT85 AS ROLE_ID, TO_NUMBER(COLUMN_VALUE) AS MENU_ID

             FROMTABLE(SPLITSTR('10,20,30',','))

         ) A;

INSERT INTO TB_SYS_ROLE_MENU

  SELECTA.ROLE_ID, A.MENU_ID

    FROM (SELECT85 AS ROLE_ID, TO_NUMBER(COLUMN_VALUE) AS MENU_ID

             FROMTABLE(SPLITSTR('10,20,30,80',','))

            MINUS

          SELECTB.ROLE_ID, B.MENU_ID

             FROMTB_SYS_ROLE_MENU B

            WHEREB.ROLE_ID = 85

         ) A

2:数据检测秘密武器,如检测商品表中有的供应商ID,在供应商表中反而没有。

SELECT VEN_ID  FROM TB_PROD_MAS

MINUS

SELECT VEN_ID  FROM TB_VED_MAS



原创粉丝点击