Mysql
 sql >> база данни >  >> RDS >> Mysql

сложни sql дървесни редове

Има няколко алтернативи за улесняване на работа с йерархична информация в SQL:

  • Общи таблични изрази (съгласно стандарта SQL-2003) поддържат рекурсивни SQL заявки спрямо типа родителски идентификатор данни, които използвате. Засега MySQL не поддържа тази функция. PostgreSQL 8.4, Microsoft SQL Server и IBM DB2 са примери за марки RDBMS, които поддържат CTE синтаксис. Oracle също има собствено разширение за SQL синтаксис, което поддържа рекурсивни заявки.

  • Вложени набори (лявото/дясното решение, което @phantombrain споменава) е решение, подробно описано в книгата на Джо Селко „Дървета и йерархии в SQL за Smarties“, както и в множество статии и публикации в блогове в интернет.

  • Изброяване на пътя (известен още като Материализиран път) съхранява низ във всеки ред в йерархията, за да отбележи пътя на предците на този ред. Комбинирайте това с LIKE заявки за сравняване на низа за път с пътищата на предците и пътищата на потомците.

  • Таблица за затваряне (известен още като Transitive Closure Relation) използва втора таблица за съхраняване на всички връзки предшественик-потомник, а не само непосредствения родител, както в дизайна, който използвате. Много видове заявки стават по-лесни, след като съхраните всички пътища.

  • Хибридни решения също съществуват. Например, съхранявайте непосредствения родителски идентификатор, както правите, но също и корена на дървото. Сега можете да получите всички други редове в същата йерархия, да ги извлечете в кода на приложението и да сортирате дървото с конвенционални структури от данни.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка в MySQL-Linux при опит за спиране на услугата

  2. Колона с автоматично увеличение:разлики в SQL синтаксиса между Oracle и MySQL

  3. Ruby On Rails е бавен...?

  4. Как работи SQL инжекцията и как да се предпазя от нея

  5. MySQL добър начин да вмъкнете ред, ако не е намерен, или да го актуализирате, ако бъде намерен