SELECT ORG_ID FROM GSYS_ORG START WITH ORG_ID = #{orgid} CONNECT BY PRIOR ORG_ID = ORG_PID 怎么改为mysql的语句。mysql为8.0以下版本,尽量多写出几种实现方式
时间: 2024-03-17 09:42:14 浏览: 17
在 MySQL 8.0 以下的版本中,可以使用以下多个方式实现类似 Oracle 中 CONNECT BY PRIOR 的递归查询:
1. 使用嵌套查询
```
SELECT org_id FROM gsys_org WHERE org_id = #{orgid}
UNION ALL
SELECT t.org_id FROM gsys_org t INNER JOIN (SELECT org_id FROM gsys_org WHERE org_pid = #{orgid}) tt ON t.org_id = tt.org_id
```
这个查询使用了嵌套查询,首先查询根节点,然后通过 INNER JOIN 与下一层的节点进行连接,递归查询整个树。
2. 使用 LEFT JOIN
```
SELECT DISTINCT t1.org_id
FROM gsys_org t1
LEFT JOIN gsys_org t2 ON t1.org_id = t2.org_pid
LEFT JOIN gsys_org t3 ON t2.org_id = t3.org_pid
LEFT JOIN gsys_org t4 ON t3.org_id = t4.org_pid
LEFT JOIN gsys_org t5 ON t4.org_id = t5.org_pid
WHERE t1.org_id = #{orgid} OR t2.org_id = #{orgid} OR t3.org_id = #{orgid} OR t4.org_id = #{orgid} OR t5.org_id = #{orgid};
```
这个查询使用了多个 LEFT JOIN,每个连接表示了树的一层,这样可以模拟 CONNECT BY PRIOR 的递归查询。
3. 使用自连接
```
SELECT t1.org_id
FROM gsys_org t1
LEFT JOIN gsys_org t2 ON t1.org_id = t2.org_pid
LEFT JOIN gsys_org t3 ON t2.org_id = t3.org_pid
LEFT JOIN gsys_org t4 ON t3.org_id = t4.org_pid
LEFT JOIN gsys_org t5 ON t4.org_id = t5.org_pid
WHERE t1.org_id = #{orgid}
```
这个查询与上一个查询非常相似,但是只查询了根节点,然后通过多个 LEFT JOIN 与下一层的节点进行连接,递归查询整个树。这种方式比第二种方式更简洁,但是可能对性能有一些影响。
以上是几种在 MySQL 8.0 以下版本中实现 CONNECT BY PRIOR 的递归查询的方式,根据实际情况选择合适的方式。