Predicato Existential
Existential predicate, predicato di esistenza
Un predicato existential è un’espressione logica che restituisce TRUE se esiste almeno una riga che soddisfa una condizione data. In SQL è il meccanismo alla base degli operatori EXISTS e NOT EXISTS, usati tipicamente in subquery correlate per verificare la presenza o l’assenza di dati correlati senza recuperarli esplicitamente.
Come funziona #
Il motore valuta la subquery correlata riga per riga rispetto alla query esterna. Non appena trova la prima riga che soddisfa la condizione, restituisce TRUE e interrompe la scansione (short-circuit evaluation). Questo lo rende spesso più efficiente di un JOIN o di un IN su grandi dataset.
-- Verifica che esista almeno un ordine attivo per ogni cliente
SELECT c.id, c.nome
FROM clienti c
WHERE EXISTS (
SELECT 1
FROM ordini o
WHERE o.cliente_id = c.id
AND o.stato = 'ATTIVO'
);
Il SELECT 1 nella subquery è convenzionale: il valore proiettato è irrilevante, conta solo l’esistenza della riga.
Quando si usa #
Il predicato existential è il pattern naturale per implementare Assertions di tipo “almeno uno”: vincoli o controlli che richiedono la presenza garantita di almeno un record correlato. In Oracle 23ai, dove le Assertions dichiarative non sono ancora esposte come oggetti DDL nativi, EXISTS in trigger o check constraint è il sostituto operativo standard.
NOT EXISTS copre il caso complementare — nessuna riga deve soddisfare la condizione — utile per vincoli di esclusione o per rilevare gap in serie temporali.
Un limite da tenere presente: su subquery non correlate o su colonne non indicizzate, il costo può degradare a scansione completa. L’analisi del piano di esecuzione (EXPLAIN PLAN) è sempre consigliata prima di portare in produzione query con EXISTS su tabelle di grandi dimensioni.