案例一:
现在有表A、AA、AAA
业务如下:
A、AA、AAA三个表依次是父子关系,即A是AA的父表、AA是AAA的父表
现做如下的假设:
A ->库房
AA->商品表,其中应用了库房的ID
AAA->出库表,其中引用了商品的ID
现在查询表中的那条记录是属于出库完毕:
库房出库完毕是指当前库房下的每个商品他对应的数量等于每个商品对于的出库记录之和都相等。
以下是表结构和初始数据:
create table TESTPAC.A ( id VARCHAR2(32) ) -- create table TESTPAC.AA ( id VARCHAR2(32), a_id VARCHAR2(32), quty NUMBER ) -- create table TESTPAC.AAA ( id VARCHAR2(32), aa_id VARCHAR2(32), quty NUMBER ) -- create table TESTPAC.B ( id VARCHAR2(32), a_id VARCHAR2(32) )
初始化数据:
A:
AA:
AAA:
以下是EXISTS语句:
意思是在AA表中不存在数量与子表的数量之和不相等的,即全部都相等:
1 SELECT * 2 FROM a 3 WHERE NOT EXISTS 4 (SELECT * 5 FROM aa 6 WHERE aa.a_id = a.id 7 AND aa.quty != 8 (SELECT nvl(SUM(aaa.quty), 0) FROM aaa WHERE aaa.aa_id = aa.id))
结果:
案例二:
现有用户表USERS和部门表DEPT,在添加用户的过程中,需要填写用户所在的部门,
现在需要查询存在于当前节点和当前节点下的所有的子部门中的用户。
表定义如下:
create table DEPT ( id VARCHAR2(32), dept_name VARCHAR2(32), p_id VARCHAR2(32) ) -- -- Create table create table USERS ( id VARCHAR2(32), username VARCHAR2(32), dept_id VARCHAR2(32) )
DEPT表中的数据:
1 SELECT lpad(' ', LEVEL * 5) || dept_name 2 FROM dept t 3 START WITH t.p_id = 'ROOT' 4 CONNECT BY PRIOR t.id = t.p_id;
USERS表中的数据:
EXISTS语句如下:
1、查询当前节点和其子节点的数据:
1 SELECT t.*, 2 t.rowid 3 FROM users t 4 WHERE EXISTS (SELECT NULL 5 FROM (SELECT id 6 FROM dept t 7 START WITH t.id = 'AA1' 8 CONNECT BY PRIOR t.id = t.p_id) cols 9 WHERE cols.id = t.dept_id)
2、根据页面的是否选择子节点的标志位,整合到一个SQL语句中:
1 SELECT t.*, 2 t.rowid 3 FROM users t 4 WHERE EXISTS 5 (SELECT NULL 6 FROM (SELECT id 7 FROM dept t 8 WHERE t.id = 9 decode(:是否包含子节点的数据的标志位,'Y' :传递的id, t.id) 10 START WITH t.id = 'AA1' 11 CONNECT BY PRIOR t.id = t.p_id) cols 12 WHERE cols.id = t.dept_id)
--完!