sql >> Base de Datos >  >> RDS >> Oracle

¿Existe un límite de anidamiento para subconsultas correlacionadas en algunas versiones de Oracle?

Las versiones recientes de Oracle no tienen un límite, pero la mayoría de las versiones anteriores de Oracle tienen un límite de anidamiento de 1 nivel profundo.

Esto funciona en todas las versiones:

SELECT  (
        SELECT  *
        FROM    dual dn
        WHERE   dn.dummy = do.dummy
        )
FROM    dual do

Esta consulta funciona en 12c y 18c pero no funciona en 10g y 11g. (Sin embargo, hay al menos una versión de 10g que permitió esta consulta. Y hay un parche para habilitar este comportamiento en 11g).

SELECT  (
        SELECT  *
        FROM    (
                SELECT  *
                FROM    dual dn
                WHERE   dn.dummy = do.dummy
                )
        WHERE   rownum = 1
        )
FROM    dual do

Si es necesario, puede solucionar esta limitación con funciones de ventana (que puede usar en SQL Server también:)

SELECT  *
FROM    (
        SELECT  m.material_id, ROW_NUMBER() OVER (PARTITION BY content_id ORDER BY resolution DESC) AS rn
        FROM    mat m
        WHERE   m.material_id IN
                (
                SELECT  con.content_id
                FROM    con_groups
                JOIN    con
                ON      con.content_id = con_groups.content_id
                WHERE   con_groups.content_group_id = 10
                )
        )
WHERE   rn = 1