最近使用到了递归查询,用于地区查询,即传递一个地区的id,使用一条sql语句将传递的这个地区下面所有子地区以及子子地区全部查询出来,这个地区递归查询功能很多地方都会用到,这里记录下来,方便自己和朋友们使用;
sql如下:
WITH temp (areaid) AS (
SELECT
areaid
FROM
area
WHERE
areaid =340000
UNION ALL
SELECT
a.areaid
FROM
area a
INNER JOIN temp ON a.parentid = temp.areaid
) SELECT
*
FROM
temp
该查询语句的关键字为with as,union all.
该查询语句由两条select查询语句构成,第一条select语句只会执行一次,查出我们传进来的地区id参数对应的地区数据,将查询出来的结果集表赋到temp表中(temp表的表名可以自定义,temp表后面括号中的字段要和查出来的结果集中的字段相对应,并且括号里定义的字段,决定temp表中有哪些字段),然后执行第二条select语句,即
SELECT
a.areaid
FROM
area a
INNER JOIN temp ON a.parentid = temp.areaid
这条sql语句就是再一次查询area表,将得到的结果接追加到temp表中(即取结果集和temp的并集),将得到的并集再一次赋到temp表中,然后继续执行
SELECT
a.areaid
FROM
area a
INNER JOIN temp ON a.parentid = temp.areaid
语句,又将结果集赋到temp表中,依次内推,知道第二条select语句结果集为空,就停在递归查询,最后执行
SELECT
*
FROM
temp
即查询最终得到的temp表中的所有数据,得到的结果集就是我们需要的数据
(向上递归和向下递归,只需要改变 a.parentid = temp.areaid 就行,即决定哪张表为子表,哪张表为父表)