La clàusula SQL WITH va ser introduïda per Oracle a la base de dades Oracle 9i release 2. La clàusula SQL WITH us permet donar un nom a un bloc de subconsulta (un procés també anomenat refactorització de subconsultes), que es pot fer referència en diversos llocs dins de la consulta SQL principal.
- La clàusula s'utilitza per definir una relació temporal de manera que la sortida d'aquesta relació temporal estigui disponible i sigui utilitzada per la consulta associada a la clàusula WITH.
- Les consultes que tenen una clàusula WITH associada també es poden escriure mitjançant subconsultes imbricades, però això afegeix més complexitat per llegir/depurar la consulta SQL.
- La clàusula WITH no és compatible amb tots els sistemes de bases de dades.
- El nom assignat a la subconsulta es tracta com si fos una vista o taula en línia
- La clàusula SQL WITH va ser introduïda per Oracle a la base de dades Oracle 9i release 2.
Sintaxi:
WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table) SELECT Attr1 FROM Table, temporaryTable WHERE Table.Attr1>temporaryTable.averageValue;>

data de javascript
En aquesta consulta, la clàusula WITH s'utilitza per definir una relació temporal temporaryTable que només té 1 atribut averageValue. averageValue conté el valor mitjà de la columna Attr1 descrit a la relació Taula. La instrucció SELECT que segueix la clàusula WITH només produirà aquelles tuples on el valor de Attr1 en relació a la taula és superior al valor mitjà obtingut de la instrucció de la clàusula WITH.
Nota: Quan s'executa una consulta amb una clàusula WITH, primer s'avalua la consulta esmentada dins de la clàusula i la sortida d'aquesta avaluació s'emmagatzema en una relació temporal. Després d'això, finalment s'executa la consulta principal associada a la clàusula WITH que utilitzaria la relació temporal produïda.
Consultes
Exemple 1: Trobeu tots els empleats que tinguin un sou superior al salari mitjà de tots els empleats.
Nom de la relació: Empleat
| ID de l'empleat | Nom | Sou |
|---|---|---|
| 100011 | Smith | 50000 |
| 100022 | Bill | 94000 |
| 100027 | A si mateix | 70550 |
| 100845 | Walden | 80000 |
| 115585 | Erik | 60000 |
| 1100070 | Kate | 69000 |
Consulta SQL:
WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee) SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary>temporaryTable.averageValue;>
Sortida:
| ID de l'empleat | Nom | Sou |
|---|---|---|
| 100022 | Bill | 94000 |
| 100845 | Walden | 80000 |
Explicació: El salari mitjà de tots els empleats és de 70591. Per tant, tots els empleats el salari dels quals és superior a la mitjana obtinguda es troben en la relació de producció.
Exemple 2: Trobeu totes les companyies aèries on el sou total de tots els pilots d'aquesta companyia aèria és superior a la mitjana del sou total de tots els pilots de la base de dades.
Nom de la relació: Pilot
| ID de l'empleat | Companyia aèria | Nom | Sou |
|---|---|---|---|
| 70007 | Airbus 380 | Quim | 60000 |
| 70002 | Boeing | Laura | 20000 |
| 10027 | Airbus 380 | Voluntat | 80050 |
| 10778 | Airbus 380 | Warren | 80780 |
| 115585 | Boeing | Smith | 25000 |
| 114070 | Airbus 380 | Katy | 78000 |
Consulta SQL:
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>airlineAverage.avgSalary;>
Sortida:
| Companyia aèria |
|---|
| Airbus 380 |
Explicació: El sou total de tots els pilots d'Airbus 380 = 298.830 i el de Boeing = 45.000. Salari mitjà de tots els pilots de la taula Pilot = 57.305. Com que només el sou total de tots els pilots de l'Airbus 380 és superior al sou mitjà obtingut, per tant L'Airbus 380 es troba en la relació de sortida.
llista de matrius
Punts importants:
- La clàusula SQL WITH és bona quan s'utilitza amb sentències SQL complexes en lloc de simples
- També us permet dividir les consultes SQL complexes en altres més petites que faciliten la depuració i el processament de les consultes complexes.
- La clàusula SQL WITH és bàsicament una substitució de la subconsulta normal.