Oracle
 sql >> Database >  >> RDS >> Oracle

Esiste un limite di annidamento per le sottoquery correlate in alcune versioni di Oracle?

Le versioni recenti di Oracle non hanno un limite, ma la maggior parte delle versioni precedenti di Oracle ha un limite di annidamento di 1 livello in profondità.

Funziona su tutte le versioni:

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

Questa query funziona in 12c e 18c ma non funziona in 10g e 11g. (Tuttavia, esiste almeno una versione di 10g che ha consentito questa query. E c'è una patch per abilitare questo comportamento in 11g.)

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

Se necessario, puoi aggirare questa limitazione con le funzioni della finestra (che puoi utilizzare in SQL Server anche :)

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