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)
以下INTERSECT、MINUS两句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