Heim  >  Artikel  >  Datenbank  >  DB2通过SQL实现递归查询 (根据子机构查询机构所属树)

DB2通过SQL实现递归查询 (根据子机构查询机构所属树)

WBOY
WBOYOriginal
2016-06-07 15:31:232086Durchsuche

create table MAIN_NODE ( MLA_ID INTEGER not null, MLA_ROOTID INTEGER, MLA_PARENTID INTEGER, MLA_NAME VARCHAR(50), PRIMARY KEY (MLA_ID) ) //查询子机构所属 树结构; //WHERE PARENT. mla_id= CHILD.mla_parentid (父机构及其所有子机构) WITH RPL (m

create table  MAIN_NODE (
MLA_ID               INTEGER     not null,  
MLA_ROOTID          INTEGER,                    
MLA_PARENTID        INTEGER,                    
MLA_NAME            VARCHAR(50),    
PRIMARY KEY (MLA_ID)

)

//查询子机构所属 树结构; // WHERE PARENT. mla_id= CHILD.mla_parentid (父机构及其所有子机构)

WITH  RPL (mla_parentid, mla_id, mla_name) AS
(
SELECT ROOT.mla_parentid, ROOT.mla_id, ROOT.mla_name FROM main_node ROOT WHERE ROOT.mla_id = 3
UNION  ALL
SELECT CHILD.mla_parentid, CHILD.mla_id, CHILD.mla_name FROM RPL PARENT, main_node CHILD WHERE PARENT.mla_parentid = CHILD.mla_id
 )
SELECT DISTINCT mla_parentid, mla_id, mla_name FROM RPL ORDER BY mla_parentid, mla_id, mla_name


让我们研究这个查询语句:

  • RPL 作为一个具有以下三列的虚拟表:mla_parentid, mla_id 和 mla_name。
  • WITH 子句内的第一个 SELECT 语句是初始化表。它只执行一次。它的结果形成虚拟表的初始内容以作为递归的种子。在上面的示例中,种子是 mla_id 为 任意传进去的参数 的一行或多行。
  • 第二个 SELECT 语句执行多次。将种子作为输入(JOIN 中的辅助表)传递给第二个 SELECT 语句以产生下一个行集合。将 JOIN 的结果添加(UNION ALL)到虚拟表的当前内容中,并放回到其中以形成用于下一次传递的输入。只要有行产生,这个过程就会继续。
  • 如果期望,虚拟表上最后的 SELECT 允许我们选择递归查询所产生的所有行或仅部分行。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn