Oracle
 sql >> Base de données >  >> RDS >> Oracle

Existe-t-il une limite d'imbrication pour les sous-requêtes corrélées dans certaines versions d'Oracle ?

Les versions récentes d'Oracle n'ont pas de limite mais la plupart des anciennes versions d'Oracle ont une limite d'imbrication de 1 niveau profond.

Cela fonctionne sur toutes les versions :

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

Cette requête fonctionne en 12c et 18c mais ne fonctionne pas en 10g et 11g. (Cependant, il existe au moins une version de 10g qui autorise cette requête. Et il existe un correctif pour activer ce comportement dans 11g.)

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

Si nécessaire, vous pouvez contourner cette limitation avec des fonctions de fenêtre (que vous pouvez utiliser dans SQL Server aussi :)

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