วันพฤหัสบดีที่ 3 เมษายน พ.ศ. 2557

ดึงข้อมูลจาก Database db2 เมื่อข้อมูลใน Table มีการต่อเรียงข้อมูลแบบ Tree วิธีดึงข้อมูลโหนดลูกทั้งหมดทำอย่างไร

ตัวอย่างนี้ใช้ Table BG_EXPENSE ในการสมมุติเป็นข้อมูลใน database เราทำการสร้าง Query เพื่อทดลองดึงข้อมูลจาก database ที่เก็บในรูปแบบ Tree มีการเชื่อมต่อโหนดด้วยข้อมูลใน Field ลองมาดูรายละเอียดกัน
Table BG_EXPENSE


คำอธิบาย Table
Expense_id เป็น Primary key
Parent_id เป็น id โหนดแม่
Is_leaf เป็น Flag บอกว่าโหนดนี้เป็นตัวสุดท้ายใน Tree หรือก็คือเป็นใบแล้วนั้นเอง

สร้าง With ขึ้นมาเพื่อทำการ Recursive Query
WITH RPL ( IS_LEAF,EXPENSE_ID, PARENT_ID) AS
     (SELECT ROOT.IS_LEAF,ROOT.EXPENSE_ID, ROOT.PARENT_ID
        FROM BG_EXPENSE ROOT
        WHERE ROOT.EXPENSE_ID = 191
     UNION ALL
        SELECT CHILD.IS_LEAF,CHILD.EXPENSE_ID, CHILD.PARENT_ID
           FROM RPL PARENT, BG_EXPENSE CHILD
           WHERE PARENT.EXPENSE_ID = CHILD.PARENT_ID)
ถ้าต้องการดึงโหนดแม่ แทนการดึงโหนดลูก ให้เปลี่ยน EXPENSE_ID กับ PARENT_ID สลับที่กันใน WHERE PARENT.EXPENSE_ID = CHILD.PARENT_ID

เมื่อสร้าง With แล้วให้ดึงด้วย Select เพื่อดึงข้อมูลออกมาใช้ตามต้องการ
SELECT DISTINCT o1.IS_LEAF,o1.EXPENSE_ID, o1.PARENT_ID
    FROM RPL o1
    WHERE o1.IS_LEAF = 'Y'

สรุปเขียน SQL ได้ว่า
 WITH RPL ( IS_LEAF,EXPENSE_ID, PARENT_ID) AS
     (SELECT ROOT.IS_LEAF,ROOT.EXPENSE_ID, ROOT.PARENT_ID
        FROM BG_EXPENSE ROOT
        WHERE ROOT.EXPENSE_ID = 191
     UNION ALL
        SELECT CHILD.IS_LEAF,CHILD.EXPENSE_ID, CHILD.PARENT_ID
           FROM RPL PARENT, BG_EXPENSE CHILD
           WHERE PARENT.EXPENSE_ID = CHILD.PARENT_ID)
SELECT DISTINCT o1.IS_LEAF,o1.EXPENSE_ID, o1.PARENT_ID
    FROM RPL o1
    WHERE o1.IS_LEAF = 'Y'

ไม่มีความคิดเห็น:

แสดงความคิดเห็น