SQL kullanarak ilişkisel bir veritabanında ağaç benzeri verileri izleme


16

SQL'de ağaç verilerinin arasında geçiş yapmanın bir yolu var mı? connect byOracle hakkında biliyorum , ama bunu diğer SQL uygulamalarında yapmanın başka bir yolu var mı? Kullanmak connect byher döngü için sorguyu çalıştırmak için bir döngü veya özyinelemeli işlev yazma daha kolay çünkü soruyorum .

Bazı insanlar "ağaç verileri" ifadesi ile karışık gibi göründüğünden, daha fazla açıklayacağım: Demek istediğim, parent_idaynı tablodaki başka bir satırdan birincil anahtar içeren bir veya benzer alana sahip tablolar ile ilgili .

Soru, bir Oracle veritabanında bu şekilde saklanan verilerle çalıştığım ve connect bydiğer DBMS'lerde uygulanmadığını bildiğim bir deneyimden geliyor . Standart SQL kullanacak olsaydı, yukarı çıkmak isteyen her bir üst öğe için yeni bir tablo diğer adı oluşturmak gerekirdi. Bu kolayca kontrolden çıkabilir.


Joe Celko'nun çözümlerine sahipsiniz. Birkaç örnekler: SQL Ağaçlar , Oracle'da Ağaçları ve Hiyerarşi , İç içe set modeli . Sözdizimi şekeri ;-) olması gerekli değildir.
Marian

Yanıtlar:


14

Celko'nun kitabı iyi bir kaynaktır - zaman zaman aşırı derecede "akademik" ise.

Ben de gerçekten 'iyi kapanış tabloları' olarak bilinen bu yöntemi bulduk .

Özyinelemeli CTE'lere ( PostgreSQL 8.4 veya daha yenisi veya SQL Server 2005 veya daha yenisi ) izin veren bir veritabanı kullanıyorsanız , bunlar gerçekten en iyi yoldur. Oracle kullanıyorsanız, her zaman saygıdeğer "bağlan" vardır .

Deneyimime göre, bir "saf ağaç" şemasında bir dizi tablo teslim etmek ve temizleyiciyi oluşturma fırsatına sahip olmaktan ziyade, bu depodan doğru ağacı nasıl çıkaracağınızı bulmak çok daha yaygındır. kapanış tabloları.


9

Özyinelemeli bir CTE en kolay çözümünüz olacaktır. SQL Server 2005 ve PostgreSQL'in güncel sürümleri CTE'leri destekler. SQL Server 2008 veya daha yenisini kullanıyorsanız, HIERARCHYIDveri türünü kullanabilirsiniz . Bunun iyi bir örneğini HierarchyID'de bulabilirsiniz: Veri Hiyerarşilerinizi SQL Server 2008 ile Modelleyin

Ek kaynaklar:


5

SQL Server'da (2005 ve sonraki sürümlerde) sıradüzenleri okumak için Ortak Tablo İfadeleri kullanabilirsiniz, bkz. Microsoft SQL Server 2005 - CTE Birkaç örnek için basit bir hiyerarşi örneği.

Konuyla ilgili daha genel olarak Joe Celko tarafından "Smarties için SQL'de Ağaçlar ve Hiyerarşiler" adlı bir kitap önerildi - ancak aslında henüz kitaba bakmadım.


1

Standart SQL yöntemi, Özyinelemeli CTE tarafından sağlanan WITH [ RECURSIVE ]ve sorgudaki gibi atanan bir “Özyinelemeli sorgu” dur . Uygulama spesifikasyonda belirtilmez, sadece özyinelemeli yapıları sorgulamak için kullanılabilir yöntemler. En basit durumda, veri yapısının uygulanması yalnızca bir satırda bir kimlik ve üst kimlik gerektirir.

RDBMS'ye özgü birçok çözüm de vardır: örneğin, PostgreSQL, Yinelemeli CTE'leri destekler, ancak ltreeuygulamada farklı avantajlar ve dezavantajlar kümesi sağlar.

etiketinde arama yaparak bu site hakkında daha fazla bilgi bulabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.