数据库存在自关联的表结构中,比如说
部门表, 部门之间的级联关系是通过部门ID和 部门PID维护的.
职工表, 职工之间的上下级是通过职工ID和 职工PID维护的
以部门为例, 如果我们想查询某个部门是否是另外一个部门的子部门该怎么查?
简单思考下, 这个问题好像需要递归处理, 因为子部门可能在这个部门的二级,三级或者更多级, 那么我们需要
1.先查到部门的ID,
2.然后根据ID在匹配PID,去查出子的ID
3.继续根据子ID去查询孙ID.... 直到查不出来东西为止.
这个逻辑应用程序很容易实现, 单条SQL好像无法实现. 后面查询到了MYSQL8.0开始支持的递归算法如下:
WITH RECURSIVE childSql AS (
SELECT id, name, pid from dept
WHERE pid = 521
UNION ALL
SELECT d.id, d.name, d.pid FROM dept d
JOIN childSql ON d.pid = childSql.id
)
SELECT * FROM childSql;
-- 给一个PID 查出所有符合的子项
WITH RECURSIVE ret AS (
SELECT id, dict_name,dict_code, parent_id, sorted FROM business_dict
WHERE parent_id = 3 and enabled is true and displayed is true
UNION ALL
SELECT d.id, d.dict_name, d.dict_code, d.parent_id, d.sorted FROM business_dict d
JOIN ret ON d.parent_id = ret.id where d.enabled is true and d.displayed is true
)
SELECT * FROM ret order by sorted