stringtranslate.com

Consultas jerárquicas y recursivas en SQL

Una consulta jerárquica es un tipo de consulta SQL que maneja datos de modelos jerárquicos . Son casos especiales de consultas de punto fijo recursivas más generales , que calculan cierres transitivos .

En el estándar SQL:1999, las consultas jerárquicas se implementan mediante expresiones de tabla comunes recursivas (CTE). A diferencia de la cláusula connect-by anterior de Oracle, las CTE recursivas se diseñaron con semántica de punto fijo desde el principio. [1] Las CTE recursivas del estándar eran relativamente cercanas a la implementación existente en IBM DB2 versión 2. [1] Las CTE recursivas también son compatibles con Microsoft SQL Server (desde SQL Server 2008 R2), [2] Firebird 2.1 , [3] PostgreSQL 8.4+ , [4] SQLite 3.8.3+ , [5] IBM Informix versión 11.50+, CUBRID , MariaDB 10.2+ y MySQL 8.0.1+ . [6] Tableau tiene documentación que describe cómo se pueden utilizar las CTE. TIBCO Spotfire no admite las CTE, mientras que la implementación de Oracle 11g Release 2 carece de semántica de punto fijo.

Sin expresiones de tabla comunes ni cláusulas conectadas es posible lograr consultas jerárquicas con funciones recursivas definidas por el usuario. [7]

Expresión de tabla común

Una expresión de tabla común, o CTE (en SQL ), es un conjunto de resultados con nombre temporal, derivado de una consulta simple y definido dentro del ámbito de ejecución de una declaración SELECT, INSERT, UPDATEo .DELETE

Las CTE pueden considerarse alternativas a las tablas derivadas ( subconsultas ), vistas y funciones definidas por el usuario en línea.

Las expresiones de tabla comunes son compatibles con Teradata (a partir de la versión 14), IBM Db2 , Informix (a partir de la versión 14.1), Firebird (a partir de la versión 2.1), [8] Microsoft SQL Server (a partir de la versión 2005), Oracle (con recursión desde la versión 11g 2), PostgreSQL (desde 8.4), MariaDB ( desde 10.2), MySQL (desde 8.0), SQLite (desde 3.8.3), HyperSQL , Informix (desde 14.10), [9] Google BigQuery , Sybase (a partir de la versión 9), Vertica , H2 (experimental), [10] y muchos otros . Oracle llama a las CTE "factorización de subconsultas". [11]

La sintaxis de una CTE (que puede ser recursiva o no) es la siguiente:

CON [ RECURSIVO ] con_consulta [, ...] SELECCIONAR ...     

donde with_queryla sintaxis es:

nombre_consulta [ ( nombre_columna [,...]) ] AS ( SELECT ...)       

Se pueden utilizar CTE recursivas para recorrer relaciones (como gráficos o árboles), aunque la sintaxis es mucho más compleja porque no se crean pseudocolumnas automáticas (como se muestra LEVELa continuación); si se desean, se deben crear en el código. Consulte la documentación de MSDN [2] o la documentación de IBM [12] [13] para ver ejemplos de tutoriales.

La RECURSIVEpalabra clave normalmente no es necesaria después de WITH en sistemas distintos de PostgreSQL. [14]

En SQL:1999, una consulta recursiva (CTE) puede aparecer en cualquier lugar donde se permita una consulta. Es posible, por ejemplo, nombrar el resultado utilizando CREATE[ RECURSIVE] VIEW. [15] Al utilizar una CTE dentro de una INSERT INTO, se puede llenar una tabla con datos generados a partir de una consulta recursiva; la generación aleatoria de datos es posible utilizando esta técnica sin utilizar ninguna instrucción de procedimiento. [16]

Algunas bases de datos, como PostgreSQL, admiten un formato CREATE RECURSIVE VIEW más corto que se traduce internamente a codificación WITH RECURSIVE. [17]

Un ejemplo de una consulta recursiva que calcula el factorial de números del 0 al 9 es el siguiente:

CON recursiva temp ( n , fact ) AS ( SELECT 0 , 1 - Subconsulta inicial UNION ALL SELECT n + 1 , ( n + 1 ) * fact FROM temp DONDE n < 9 - Subconsulta recursiva ) SELECT * FROM temp ;                         

CONECTAR POR

Una sintaxis alternativa es la construcción no estándar CONNECT BY; fue introducida por Oracle en la década de 1980. [18] Antes de Oracle 10g, la construcción solo era útil para recorrer gráficos acíclicos porque devolvía un error al detectar cualquier ciclo; en la versión 10g Oracle introdujo la característica NOCYCLE (y la palabra clave), lo que hizo que el recorrido funcionara también en presencia de ciclos. [19]

CONNECT BYes compatible con Snowflake , EnterpriseDB , [20] Oracle database , [21] CUBRID , [22] IBM Informix [23] e IBM Db2 aunque solo si está habilitado como modo de compatibilidad. [24] La sintaxis es la siguiente:

SELECCIONAR lista_de_selección DE expresión_de_tabla [ DONDE ... ] [ COMENZAR CON expresión_de_inicio ] CONECTAR POR [ SIN CICLO ] { ANTERIOR expr_hijo = expr_padre | expr_padre = ANTERIOR expr_hijo } [ ORDENAR HERMANOS POR columna1 [ ASC | DESC ] [, columna2 [ ASC | DESC ] ] ... ] [ AGRUPAR POR ... ] [ TENIENDO ... ] ...                                                
Por ejemplo,
SELECCIONAR NIVEL , LPAD ( ' ' , 2 * ( NIVEL - 1 )) || ename "empleado" , empno , mgr "gerente" DE emp INICIO CON mgr ES NULO CONECTAR POR ANTERIOR empno = mgr ;                         

El resultado de la consulta anterior se vería así:

nivel | empleado | empleado | gerente-------+-------------+-------+--------- 1 | REY | 7839 | 2 | JONES | 7566 | 7839 3 | SCOTT | 7788 | 7566 4 | ADAMS | 7876 | 7788 3 | FORD | 7902 | 7566 4 | SMITH | 7369 | 7902 2 | BLAKE | 7698 | 7839 3 | ALLEN | 7499 | 7698 3 | BARRIO | 7521 | 7698 3 | MARTÍN | 7654 | 7698 3 | TORNER | 7844 | 7698 3 | JAMES | 7900 | 7698 2 | CLARK | 7782 | 7839 3 | MILLER | 7934 | 7782(14 filas)

Pseudocolumnas

Operadores unarios

El siguiente ejemplo devuelve el apellido de cada empleado del departamento 10, cada gerente por encima de ese empleado en la jerarquía, la cantidad de niveles entre el gerente y el empleado y la ruta entre los dos:

SELECCIONAR ename "Empleado" , CONECTAR_POR_RAÍZ ename "Gerente" , NIVEL - 1 "Ruta" , SYS_CONNECT_BY_PATH ( ename , '/' ) "Ruta" DE emp DONDE NIVEL > 1 Y deptno = 10 CONECTAR POR ANTERIOR empno = mgr ORDENAR POR "Empleado" , "Gerente" , "Ruta" , "Ruta" ;                            

Funciones

Véase también

Referencias

  1. ^ de Jim Melton; Alan R. Simon (2002). SQL:1999: Comprensión de los componentes del lenguaje relacional. Morgan Kaufmann. ISBN 978-1-55860-456-8.
  2. ^ de Microsoft. "Consultas recursivas mediante expresiones de tabla comunes" . Consultado el 23 de diciembre de 2009 .
  3. ^ Helen Borrie (15 de julio de 2008). «Notas de la versión de Firebird 2.1» . Consultado el 24 de noviembre de 2015 .
  4. ^ "CON Consultas". 10 de febrero de 2022.PostgreSQL
  5. ^ "Cláusula CON".SQLite
  6. ^ "MySQL 8.0 Labs: [Recursive] Common Table Expressions in MySQL (CTE)" (Laboratorios de MySQL 8.0: [Recursivas] Expresiones de tabla comunes en MySQL (CTE)). Archivado desde el original el 2019-08-16 . Consultado el 2017-12-20 .equipomysqlserver.com
  7. ^ Paragon corporation: Uso de funciones definidas por el usuario de PostgreSQL para resolver el problema del árbol, 15 de febrero de 2004, consultado el 19 de septiembre de 2015
  8. ^ https://firebirdsql.org/file/documentation/reference_manuals/reference_material/Firebird-2.5-LangRef-Update.pdf [ URL básica PDF ]
  9. ^ posible antes de 14.10 con tablas temporales https://stackoverflow.com/questions/42579298/why-does-a-with-clause-give-a-syntax-error-on-informix
  10. ^ "Avanzado".
  11. ^ Karen Morton; Robyn Sands; Jared Still; Riyaj Shamsudeen; Kerry Osborne (2010). Pro Oracle SQL. Versión impresa. pág. 283. ISBN 978-1-4302-3228-5.
  12. ^ "Documentación de IBM".
  13. ^ "Documentación de IBM".
  14. ^ Regina Obe; Leo Hsu (2012). PostgreSQL: en funcionamiento. O'Reilly Media. pág. 94. ISBN 978-1-4493-2633-3.
  15. ^ Jim Melton; Alan R. Simon (2002). SQL:1999: Comprensión de los componentes del lenguaje relacional. Morgan Kaufmann. pág. 352. ISBN 978-1-55860-456-8.
  16. ^ Don Chamberlin (1998). Una guía completa para la base de datos universal DB2. Morgan Kaufmann. págs. 253-254. ISBN 978-1-55860-482-7.
  17. ^ "Crear vista". 10 de febrero de 2022.
  18. ^ Benedikt, M.; Senellart, P. (2011). "Bases de datos". En Blum, Edward K.; Aho, Alfred V. (eds.). Ciencias de la computación. El hardware, el software y su núcleo . p. 189. doi :10.1007/978-1-4614-1168-0_10. ISBN 978-1-4614-1167-3.
  19. ^ Sanjay Mishra; Alan Beaulieu (2004). Dominio de Oracle SQL. O'Reilly Media, Inc., pág. 227. ISBN 978-0-596-00632-7.
  20. ^ Consultas jerárquicas Archivado el 21 de junio de 2008 en Wayback Machine , EnterpriseDB
  21. ^ Consultas jerárquicas, Oracle
  22. ^ "Consulta jerárquica de CUBRID". Archivado desde el original el 14 de febrero de 2013. Consultado el 11 de febrero de 2013 .
  23. ^ Cláusula jerárquica, IBM Informix
  24. ^ Jonathan Gennick (2010). Guía de bolsillo de SQL (3.ª edición). O'Reilly Media, Inc., pág. 8. ISBN 978-1-4493-9409-7.

Lectura adicional

Libros de texto académicos . Tenga en cuenta que estos cubren únicamente el estándar SQL:1999 (y Datalog), pero no la extensión Oracle.

Enlaces externos