La clausola SQL WITH è stata introdotta da Oracle nel database Oracle 9i versione 2. La clausola SQL WITH consente di assegnare un nome a un blocco di sottoquery (un processo chiamato anche refactoring di sottoquery), a cui è possibile fare riferimento in diversi punti all'interno della query SQL principale.
- La clausola viene utilizzata per definire una relazione temporanea in modo che l'output di questa relazione temporanea sia disponibile e venga utilizzato dalla query associata alla clausola WITH.
- Le query a cui è associata una clausola WITH possono anche essere scritte utilizzando sottoquery nidificate, ma così facendo si aggiunge maggiore complessità alla lettura/debug della query SQL.
- La clausola WITH non è supportata da tutti i sistemi di database.
- Il nome assegnato alla sottoquery viene trattato come se fosse una vista o tabella in linea
- La clausola SQL WITH è stata introdotta da Oracle nel database Oracle 9i versione 2.
Sintassi:
WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table) SELECT Attr1 FROM Table, temporaryTable WHERE Table.Attr1>temporaryTable.averageValue;>

array di strutture in linguaggio c
In questa query, la clausola WITH viene utilizzata per definire una relazione temporanea temporaryTable che ha solo 1 attributo AverageValue. AverageValue contiene il valore medio della colonna Attr1 descritta nella relazione Table. L'istruzione SELECT che segue la clausola WITH produrrà solo quelle tuple in cui il valore di Attr1 nella relazione Table è maggiore del valore medio ottenuto dall'istruzione della clausola WITH.
Nota: Quando viene eseguita una query con una clausola WITH, viene valutata innanzitutto la query menzionata nella clausola e l'output di questa valutazione viene archiviato in una relazione temporanea. Successivamente viene finalmente eseguita la query principale associata alla clausola WITH che utilizzerebbe la relazione temporanea prodotta.
Interrogazioni
Esempio 1: Trova tutti i dipendenti il cui stipendio è superiore allo stipendio medio di tutti i dipendenti.
Nome della relazione: Dipendente
data locale
| ID Dipendente | Nome | Stipendio |
|---|---|---|
| 100011 | fabbro | 50000 |
| 100022 | Conto | 94000 |
| 100027 | Lui stesso | 70550 |
| 100845 | Walden | 80000 |
| 115585 | Erik | 60000 |
| 1100070 | Kate | 69000 |
Interrogazione SQL:
WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee) SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary>temporaryTable.averageValue;>
Produzione:
| ID Dipendente | Nome | Stipendio |
|---|---|---|
| 100022 | Conto | 94000 |
| 100845 | Walden | 80000 |
Spiegazione: Lo stipendio medio di tutti i dipendenti è 70591. Pertanto, tutti i dipendenti il cui stipendio è superiore alla media ottenuta rientrano nella relazione di produzione.
Esempio 2: Trova tutte le compagnie aeree in cui lo stipendio totale di tutti i piloti di quella compagnia aerea è superiore alla media dello stipendio totale di tutti i piloti nel database.
programma di array bidimensionale in c
Nome della relazione: Pilota
| ID Dipendente | Compagnia aerea | Nome | Stipendio |
|---|---|---|---|
| 70007 | Airbus 380 | Kim | 60000 |
| 70002 | Boeing | Laura | 20000 |
| 10027 | Airbus 380 | Volere | 80050 |
| 10778 | Airbus 380 | Warren | 80780 |
| 115585 | Boeing | fabbro | 25000 |
| 114070 | Airbus 380 | Katie | 78000 |
Interrogazione SQL:
il perno del panda
WITH totalSalary(Airline, total) as (SELECT Airline, sum(Salary) FROM Pilot GROUP BY Airline), airlineAverage(avgSalary) as (SELECT avg(Salary) FROM Pilot ) SELECT Airline FROM totalSalary, airlineAverage WHERE totalSalary.total>compagnia aereaAverage.avgSalario;>
Produzione:
| Compagnia aerea |
|---|
| Airbus 380 |
Spiegazione: Lo stipendio totale di tutti i piloti dell'Airbus 380 = 298.830 e quello della Boeing = 45000. Stipendio medio di tutti i piloti nella tabella Pilota = 57305. Poiché solo lo stipendio totale di tutti i piloti dell'Airbus 380 è maggiore dello stipendio medio ottenuto, quindi L'Airbus 380 si trova nella relazione di uscita.
Punti importanti:
- La clausola SQL WITH è utile se utilizzata con istruzioni SQL complesse anziché con istruzioni semplici
- Consente inoltre di suddividere le query SQL complesse in query più piccole che semplificano il debug e l'elaborazione delle query complesse.
- La clausola SQL WITH è fondamentalmente una sostituzione drop-in della normale sottoquery.