logo

SQL | AMB clàusula

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.