Требуется рекурсивный оператор SQL ANSI 92 - PullRequest
2 голосов
/ 24 ноября 2008

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

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

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

  1. ReportingUnit

    • col1: ключ
    • col2: ParentReportingUnitKey
  2. Facility

    • 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 ]

3 голосов
/ 24 ноября 2008

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

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

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

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

2 голосов
/ 24 ноября 2008

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

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

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

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

...