1966595

in sql, possiamo creare delle sottoquery. Queste possono essere di due tipi:

quelle che restituiscono un solo risultato
quelle che restituiscono un insieme di risultati.

Ovviamente, nel caso di in cui la sotto query restituisce un solo risultato, si possono usare gli operatori ( < = > <= >= <> ). questi ovviamente sono operatori unari e se ci sono più risultati restituiti dalla query inner, si ha un’eccezione ORACLE.

Invece, se la query inner, restituisce un insieme di risultati, si devono usare gli operatori ( IN, ANY, ALL).

le subquery, devono essere definite tra parentesi. Sono anche quelle che vengono eseguite per prima.

esempio di subquery che restituisce un solo risultato:

SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE employee_id = 141);
nel caso delle sub query, si possono usare anche i costrutti aggregatori ( AVG, MIN, MAX, COUNT ecc). Questi ottengono un solo risultato. E quindi posso usarli con gli operatori unari (<, >, <>, = ecc).

le sottoquery, possono essere usate non solo nella clausola WHERE, ma anche nella clausola HAVING, in questo post potete leggere cosa fa e a cosa serve questa clausola SQL.

ecco un esempio di come usare le subquery nella clausola HAVING:

SELECT job_id, AVG(salary)
FROM employees
GROUP BY job_id
HAVING AVG(salary) = (SELECT MIN(AVG(salary))
FROM employees
GROUP BY job_id);
un tipico esempio che si può avere lavorando con le sotto query è quello che ho raccontato in questo post, ovvero, far restituire un insieme di risultati a quelli

ORA-01427: single-row subquery returns more than one row 01427.00000 – “single row subquery returns more than one row”

ecco un esempio di query che restituisce questo genere di errore ORACLE:

SELECT employee_id, last_name
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);

la subquery, restituisce un insieme di valori, una lista di salari minimi per ogni dipartimento. Questo fa si, che l’operatore =, non riesca a sopportare la lista degli oggetti ricevuti in quanto ne aspettava solo uno.

ma che succede se la sotto query restituisce valore NULL? ovvero non restituisce nessuna riga dalla query appena eseguita? facciamo un esempio per capire meglio:

SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = ‘Haas’);

come al solito, vengono eseguite le sottoquery, in questo caso si esegue la query che cerca l’impiegato che ha come cognome il nome “HAAS”. Supponiamo che non esista nulla del genere, quindi la sottoquery restituisce null. A questo punto si effettua la prima query e si cerca un job_id che ha valore uguale a NULL. Questo non genera errore, ma il risultato ottenuto è NULL e quindi ZERO RIGHE.

in un prossimo post, parleremo del secondo tipo di sub query ovvero quelle che restituiscono più righe.

stay tuned for more updates!