sql >> Databáze >  >> RDS >> Mysql

složité řádky sql stromů

Existuje několik alternativ, jak usnadnit práci s hierarchickými informacemi v SQL:

  • Běžné tabulkové výrazy (podle standardu SQL-2003) podporují rekurzivní dotazy SQL proti typu rodičovského id dat, která používáte. MySQL zatím tuto funkci nepodporuje. PostgreSQL 8.4, Microsoft SQL Server a IBM DB2 jsou příklady značek RDBMS, které podporují syntaxi CTE. Oracle má také proprietární rozšíření syntaxe SQL, které podporuje rekurzivní dotazy.

  • Vnořené sady (řešení vlevo/vpravo, které @phantombrain zmiňuje) je řešení podrobně popsané v knize Joea Celka "Stromy a hierarchie v SQL pro Smarties" a také v mnoha článcích a blogových příspěvcích na internetu.

  • Výčet cesty (aka Materialized Path) ukládá řetězec do každého řádku v hierarchii, aby zaznamenal cestu předků tohoto řádku. Zkombinujte to s LIKE dotazy k porovnání řetězce cesty s cestami jeho předků a cestami potomků.

  • Uzavírací tabulka (aka Transitive Closure Relation) používá druhou tabulku k uložení všech vztahů předek-potomek, nejen bezprostředního rodiče jako v návrhu, který používáte. Mnoho typů dotazů se zjednoduší, jakmile budete mít všechny cesty uložené.

  • Hybridní řešení také existují. Například uložte ID bezprostředního rodiče tak, jak to děláte, ale také kořen stromu. Nyní můžete získat všechny ostatní řádky ve stejné hierarchii, načíst je do kódu aplikace a roztřídit strom pomocí konvenčních datových struktur.



  1. Jak získat další hodnotu sekvence SQL Server v Entity Framework?

  2. Vraťte pouze jeden řádek z tabulky zcela vpravo pro každý řádek v tabulce zcela vlevo

  3. Ověření dat MySQL při vkládání

  4. Pokud se mysql_num_rows rovná NULE, NEFUNGUJE