Pregunta

Actualmente estoy traduciendo las declaraciones SQL de SQL Server a su equivalente genérico ANSI en este momento, y estoy atascado con una declaración recursiva usando una declaración WITH.

En aras de concentrarme en el problema, simplificaré el problema de la siguiente manera

Si tengo dos tablas

  1. ReportingUnit

    • col1: Clave
    • col2: ParentReportingUnitKey
  2. Facility

    • col1: Clave
    • col2: ParentReportingUnitKey

Esta estructura describe una jerarquía de unidades de informes hasta una instalación, donde una unidad de informes puede tener 0 .. 1 unidades de informes directas para padres y 0 .. n unidades de informes secundarias.

Una instalación es un registro 'hoja', que se vincula a una unidad de informes.

Necesito elaborar una declaración SQL válida ANSI 92 (o en el peor de los casos, que funcione en Oracle, DB2 y SQL Server) que devolverá todas las instalaciones relacionadas con una unidad de informes dada en cualquier lugar de la jerarquía.

e.g.

  • ReportingUnit R1 tiene ReportingUnit child R1.1 y R1.2
  • ReportingUnit R1.1 tiene hijos R1.1.1, R1.1.2
  • ReportingUnit R1.2 tiene hijos R1.2.1, R1.2.2

  • La instalación F1 tiene una unidad de informes principal R1.1.1

  • La instalación F2 tiene una unidad de informes principal R1.1.2
  • La instalación F3 tiene una unidad de informes principal R1.2.1
  • La instalación F4 tiene una unidad de informes principal R1.2.2

Teniendo en cuenta que puede haber 0 .. n niveles de recursividad en la tabla ReportingUnit, ¿cómo puedo devolver las 4 instalaciones de una instrucción SQL dado el parámetro ReportingUnit = R1?

¿Fue útil?

Solución

Estoy bastante seguro de que no había declaraciones recursivas disponibles en SQL-92; la primera versión donde fue compatible fue SQL-99.

Consecuentemente, está atascado con no usar SQL-92. ¿Por qué crees que SQL-92 es deseable? ¿Es como un nivel base de funcionalidad SQL, o hay alguna otra razón?

Las versiones actuales de DB2 tienen la cláusula WITH y pueden realizar consultas recursivas. Creo que Oracle también tiene la cláusula WITH; No estoy seguro de si puede lograr consultas recursivas al usarlos. Oracle también tiene la CONEXIÓN POR PRIORIDAD totalmente no estándar y no relacional. No estoy seguro de qué es compatible con MS SQL Server.

Existe una posibilidad razonablemente fuerte de que no pueda encontrar una sintaxis única que sea compatible con los tres DBMS especificados.

Otros consejos

No existe una solución SQL-92 para consultas recursivas.

La mejor opción es utilizar una de las soluciones para codificar relaciones jerárquicas para que pueda consultar a todos los descendientes o antepasados, utilizando SQL estándar.

Vea una breve descripción aquí: " ¿Cuál es la forma más eficiente / elegante de analizar una mesa plana en un árbol? " ;.

O lea " Árboles y jerarquías en SQL para Smarties " por Joe Celko.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top