exists (sql 返回结果集为真) not exists (sql 不返回结果集为真)
1、对于not exists查询,内表存在空值对查询结果没有影响;对于not in查询,内表存在空值将导致最终的查询结果为空。
2、对于not exists查询,外表存在空值,存在空值的那条记录最终会输出;对于not in查询,外表存在空值,存在空值的那条记录最终将被过滤,其他数据不受影响。
SELECT a.*
FROM t_department aWHERE a.id IN('1e48c442-0b70-33bc-9191-6c6c1de226bb', '6e0e7055-a032-33f9-92a4-f33163c21f49', '8a1e808b-55fd-3945-9cb3-d8857ed88389', '2e4866d9-a8e4-36c4-aa38-0bc4626d7344', 'c69db3c9-7db7-3d01-a641-2d4ded23f775')
AND NOT exists
(SELECT b.id
FROM t_department b
WHERE b.id IN('1e48c442-0b70-33bc-9191-6c6c1de226bb', '6e0e7055-a032-33f9-92a4-f33163c21f49', '8a1e808b-55fd-3945-9cb3-d8857ed88389', '2e4866d9-a8e4-36c4-aa38-0bc4626d7344', 'c69db3c9-7db7-3d01-a641-2d4ded23f775')
AND a.id != b.Id
AND instr(a.indexcode, b.INDEXCODE)>=0
AND a.levels > b.levels
)
原先数据 一级部门 A,B,C 二级部门 A1,D1,三级部门 E1
经过该sql会将具有上下级关系的部门 中 下级去掉
得到数据 一级部门 A,B,C 二级部门 D1,三级部门 E1
no exists()中查询的是A的id (此SQL主要是将上面id一一与查询出的A的id判断是否具有上下级关系有的话就把该条id去掉)