2009-11-03 17 views
5

Estoy tratando de convertir algunas consultas Oracle SQL para que funcionen (en teoría) con cualquier base de datos SQL. Algunas de las consultas son de naturaleza jerárquica y están escritas usando CONNECT BY.alternativa estándar a CONNECT BY?

¿Hay una alternativa estándar de SQL a la sintaxis de Oracle START WITH ... CONNECT BY? ¿O hay algún proceso recomendado que debo seguir para convertir las consultas jerárquicas?

+0

No hay ninguna sintaxis de consulta jerárquica ANSI que I' Estoy consciente de que, al menos, es diferente entre SQL Server, MySQL y Postgres. –

Respuesta

6

En Oracle 11gR2 admiten la recursión en Expresiones de tabla comunes (lo que la mayoría de los usuarios de Oracle conocen como factorización de sub-consulta, es decir, la cláusula WITH). Como esta es la forma de hacer las cosas de ANSI, debería ser más portátil.

Tom Kyte escribe sobre Recursive Subquery Factoring en el November 09 edition of Oracle magazine.

+0

AFAIK: SQL Server, Oracle y DB2 son las únicas bases de datos que admiten la cláusula 'WITH'. No sé si la versión de DB2 admite la recursión ... –

2

Si necesita consultas jerárquicas en bases de datos que no son compatibles con el Factoring de subconsulta recursiva (ver APC's answer), una alternativa de baja tecnología es codificar la jerarquía en una clave separada. Por supuesto, esto solo funcionará si puede controlar el proceso de actualización de la tabla y volver a escribir la clave después de las actualizaciones principales.

Por ejemplo:

FLAT_HIER_ID NODE_ID PARENT_NODE_ID 
~N1   N1 
~N1~N2  N2  N1 
~N1~N2~N3  N3  N2 
~N1~N2~N4  N4  N2 
No

muy elegante, pero le da una ruta para realizar consultas.

Otra opción (probablemente mejor) es utilizar el método "Conjunto anidado modelo". Este es el método utilizado en Fogbugz para manejar las consultas de subcajas en MSSQL, MySQL y MS Access.

El modelo se explica en:

http://www.developersdex.com/gurus/articles/112.asp

El uso del método en FogBugz se describe en:

http://www.fogcreek.com/FogBugz/blog/post/Subcases-and-Hierarchy.aspx