Требуется рекурсивный оператор SQL ANSI 92

Я перевожу SQL-операторы SQL Server в их общий эквивалент ANSI в настоящее время, и я застрял с рекурсивным оператором, использующим оператор WITH.

Чтобы сконцентрироваться на проблеме, я упросту проблему следующим образом

Если у меня есть две таблицы

  1. ReportingUnit

    • col1: ключ
    • col2: ParentReportingUnitKey
  2. объект

    • col1: ключ
    • col2: ParentReportingUnitKey

Эта структура описывает иерархию подотчетных единиц вплоть до учреждения, где подотчетная единица может иметь 0 .. 1 прямых родительских подотчетных единиц и 0 .. n дочерних подотчетных единиц.

Средство представляет собой "листовую" запись, которая связана с отчетной единицей.

Мне нужно создать действительный оператор SQL ANSI 92 (или в худшем случае, который будет работать на Oracle, DB2 и SQL Server), который будет возвращать все средства, связанные с данным подотчетным блоком, в любой точке иерархии.

например

  • ReportingUnit R1 имеет дочерние ReportingUnit R1.1 и R1.2
  • ReportingUnit R1.1 имеет детей R1.1.1, R1.1.2
  • ReportingUnit R1.2 имеет детей R1.2.1, R1.2.2

  • У объекта F1 есть родительская отчетная единица R1.1.1

  • У объекта F2 есть родительская отчетная единица R1.1.2
  • Средство F3 имеет родительскую отчетную единицу R1.2.1
  • Средство F4 имеет родительскую отчетную единицу R1.2.2

Учитывая, что в таблице ReportingUnit может быть 0 .. n уровней рекурсии, как я могу вернуть все 4 средства из оператора SQL, учитывая параметр ReportingUnit =R1?

2 ответа

Решение

Я вполне уверен, что в SQL-92 не было доступных рекурсивных операторов; самая ранняя версия, где это было поддержано, была SQL-99.

Следовательно, вы застряли с неиспользованием SQL-92. Как вы думаете, почему SQL-92 желателен? Это базовый уровень функциональности SQL или есть какая-то другая причина?

Текущие версии DB2 имеют предложение WITH и могут выполнять рекурсивные запросы. Я считаю, что в Oracle тоже есть предложение WITH; Я не уверен, может ли он добиться рекурсивных запросов с их использованием. Oracle также имеет совершенно нестандартный и нереляционный CONNECT BY PRIOR. Я не уверен, что поддерживает MS SQL Server.

Существует достаточно высокая вероятность того, что вы не сможете найти единый синтаксис, который поддерживается всеми тремя указанными вами СУБД.

Для рекурсивных запросов не существует решения SQL-92.

Наилучшим вариантом является использование одного из решений для кодирования иерархических отношений, чтобы можно было запрашивать всех потомков или предков, используя стандартный SQL.

См. Краткое описание здесь: " Какой самый эффективный / элегантный способ разбить плоский стол на дерево?".

Или прочитайте " Деревья и иерархии в SQL для умников" Джо Селко.

Другие вопросы по тегам