การสำรวจข้อมูลที่มีลักษณะคล้ายต้นไม้ในฐานข้อมูลเชิงสัมพันธ์โดยใช้ SQL


16

มีวิธีการสำรวจข้อมูลต้นไม้ใน SQL หรือไม่ ฉันรู้เกี่ยวกับconnect byใน Oracle แต่มีวิธีอื่นในการใช้ SQL อื่น ๆ ? ฉันถามเพราะการใช้connect byนั้นง่ายกว่าการเขียนลูปหรือฟังก์ชั่นวนซ้ำเพื่อเรียกใช้คิวรีสำหรับผลลัพธ์แต่ละรายการ

เนื่องจากบางคนดูเหมือนจะสับสนกับวลี "ข้อมูลต้นไม้" ฉันจะอธิบายเพิ่มเติม: สิ่งที่ฉันหมายถึงเกี่ยวกับตารางที่มีparent_idเขตข้อมูลหรือคล้ายกันซึ่งมีคีย์หลักจากแถวอื่นในตารางเดียวกัน

คำถามมาจากประสบการณ์ที่ฉันทำงานกับข้อมูลที่เก็บในลักษณะนี้ในฐานข้อมูล Oracle และรู้connect byว่าไม่ได้ดำเนินการใน DBMS อื่น ๆ หากมีใครที่จะใช้ SQL มาตรฐานคนหนึ่งจะต้องสร้างนามแฝงตารางใหม่สำหรับผู้ปกครองแต่ละคนหนึ่งที่ต้องการขึ้นไป สิ่งนี้สามารถหลุดออกจากมือได้อย่างง่ายดาย


คุณมีวิธีแก้ปัญหาของ Joe Celko ไม่กี่ตัวอย่าง: ต้นไม้ใน SQL , ต้นไม้และลำดับชั้นใน Oracle , ชุดรูปแบบที่ซ้อนกัน ไม่จำเป็นต้องมีไวยากรณ์น้ำตาล ;-)
แมเรียน

คำตอบ:


14

หนังสือของ Celkoเป็นแหล่งข้อมูลที่ดีถ้าหาก "วิชาการ" มากเกินไปในบางครั้ง

ฉันยังได้พบวิธีการนี้จริงๆ เรียกว่า 'ตารางปิด' เพื่อให้ทำงานได้ค่อนข้างดี

หากคุณใช้ฐานข้อมูลที่อนุญาตให้ CTE แบบเรียกซ้ำ (เช่นPostgreSQL 8.4 หรือใหม่กว่าหรือSQL Server 2005 หรือใหม่กว่า ) นี่เป็นวิธีที่ดีที่สุด หากคุณอยู่บน Oracle จะมี"การเชื่อมต่อโดย" ที่น่าเชื่อถืออยู่เสมอ

มันเป็นประสบการณ์ของฉันที่พบได้บ่อยกว่าการส่งชุดของตารางใน schema "ต้นไม้ไร้เดียงสา" และต้องคิดหาวิธีแยกต้นไม้ที่ถูกต้องออกจากที่เก็บข้อมูลนั้นมากกว่าที่จะมีโอกาสสร้างตัวล้าง โครงสร้าง "ตารางปิด"


9

CTE แบบเรียกซ้ำจะเป็นทางออกที่ง่ายที่สุดของคุณ SQL Server 2005 และ PostgreSQL เวอร์ชันปัจจุบันรองรับ CTE หากคุณใช้ SQL Server 2008 หรือใหม่กว่าคุณสามารถใช้HIERARCHYIDชนิดข้อมูลได้ คุณสามารถหาตัวอย่างที่ดีได้จากHierarchyID: Model Hierarchies Data ของคุณกับ SQL Server 2008

แหล่งข้อมูลเพิ่มเติม:


5

ใน SQL Server (2005 และรุ่นที่ใหม่กว่า) คุณสามารถใช้ Common Table Expressions เพื่ออ่านลำดับชั้นได้โปรดดูMicrosoft SQL Server 2005 - CTE ตัวอย่างของลำดับชั้นอย่างง่ายสำหรับตัวอย่างสองสามตัวอย่าง

ฉันได้รับการแนะนำหนังสือเกี่ยวกับเรื่องนี้โดยทั่วไปซึ่งเป็น "ต้นไม้และลำดับชั้นใน SQL สำหรับ Smarties" โดย Joe Celko - แม้ว่าฉันยังไม่ได้ดูหนังสือด้วยตัวเอง


1

วิธี SQL มาตรฐานคือ“ Recursive Query” ซึ่งมีให้โดย Recursive CTE และกำหนดเป็นWITH [ RECURSIVE ]ในแบบสอบถาม การใช้งานไม่ได้ระบุไว้ในข้อมูลจำเพาะเฉพาะวิธีการที่มีให้สำหรับโครงสร้างคิวรีที่เรียกซ้ำ ในการใช้งานกรณีที่ง่ายที่สุดของโครงสร้างข้อมูลต้องการเพียง ID และ ID ผู้ปกครองในแถว

นอกจากนี้ยังมีโซลูชันเฉพาะของ RDBMS จำนวนมากเช่น PostgreSQL รองรับ Recursive CTEs แต่มันก็มีltreeชุดของข้อดีและข้อเสียต่าง ๆ ในการนำไปใช้

คุณสามารถค้นหาข้อมูลเพิ่มเติมในเว็บไซต์นี้โดยค้นหาผ่านแท็ก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.