SQL WITH-klausulen ble introdusert av Oracle i Oracle 9i versjon 2-databasen. SQL WITH-klausulen lar deg gi en underspørringsblokk et navn (en prosess også kalt sub-spørringsrefactoring), som kan refereres til flere steder i hoved-SQL-spørringen.
pyspark
- Klausulen brukes til å definere en midlertidig relasjon slik at utdata fra denne midlertidige relasjonen er tilgjengelig og brukes av spørringen som er knyttet til WITH-leddet.
- Spørringer som har en assosiert WITH-klausul kan også skrives ved hjelp av nestede underspørringer, men det gir mer kompleksitet for å lese/feilsøke SQL-spørringen.
- WITH-klausulen støttes ikke av alle databasesystemer.
- Navnet som er tildelt underspørringen behandles som om det var en innebygd visning eller tabell
- SQL WITH-klausulen ble introdusert av Oracle i Oracle 9i versjon 2-databasen.
Syntaks:
WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table) SELECT Attr1 FROM Table, temporaryTable WHERE Table.Attr1>temporaryTable.averageValue;>

I denne spørringen brukes WITH-klausulen til å definere en midlertidig relasjon temporaryTable som bare har 1 attributt averageValue. gjennomsnittsverdi inneholder gjennomsnittsverdien av kolonne Attr1 beskrevet i relasjonstabell. SELECT-setningen som følger WITH-leddet vil kun produsere de tuplene der verdien av Attr1 i relasjonstabell er større enn gjennomsnittsverdien hentet fra WITH-leddsetningen.
Merk: Når en spørring med en WITH-klausul utføres, blir først spørringen nevnt i klausulen evaluert og utdataene fra denne evalueringen lagret i en midlertidig relasjon. Etter dette blir hovedspørringen knyttet til WITH-klausulen endelig utført som vil bruke den midlertidige relasjonen produsert.
slå av utviklermodus
Forespørsler
Eksempel 1: Finn alle ansatte hvis lønn er høyere enn gjennomsnittslønnen til alle ansatte.
Navn på forholdet: Ansatt
| Ansatt ID | Navn | Lønn |
|---|---|---|
| 100011 | Smith | 50 000 |
| 100022 | Regning | 94000 |
| 100027 | Han selv | 70550 |
| 100845 | Walden | 80 000 |
| 115585 | Erik | 60 000 |
| 1100070 | Kate | 69 000 |
SQL-spørring:
WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee) SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary>temporaryTable.averageValue;>
Produksjon:
| Ansatt ID | Navn | Lønn |
|---|---|---|
| 100022 | Regning | 94000 |
| 100845 | Walden | 80 000 |
Forklaring: Gjennomsnittslønnen til alle ansatte er 70591. Derfor ligger alle ansatte med lønn over det oppnådde gjennomsnittet i produksjonsrelasjonen.
Eksempel 2: Finn alle flyselskapene der totallønnen til alle piloter i det flyselskapet er mer enn gjennomsnittet av totallønnen til alle piloter i databasen.
java samlinger rammeverk
Navn på forholdet: Pilot
| Ansatt ID | Flyselskap | Navn | Lønn |
|---|---|---|---|
| 70007 | Airbus 380 | Kim | 60 000 |
| 70002 | Boeing | Laura | 20 000 |
| 10027 | Airbus 380 | Vil | 80050 |
| 10778 | Airbus 380 | Warren | 80780 |
| 115585 | Boeing | Smith | 25 000 |
| 114070 | Airbus 380 | Katy | 78 000 |
SQL-spørring:
char til int
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.avgLønn;>
Produksjon:
| Flyselskap |
|---|
| Airbus 380 |
Forklaring: Den totale lønnen til alle piloter på Airbus 380 = 298 830 og til Boeing = 45 000. Gjennomsnittslønn for alle piloter i tabellen Pilot = 57305. Siden bare den totale lønnen til alle piloter på Airbus 380 er høyere enn gjennomsnittslønnen som oppnås, så Airbus 380 ligger i utgangsforholdet.
Viktige punkter:
- SQL WITH-klausulen er god når den brukes med komplekse SQL-setninger i stedet for enkle
- Den lar deg også bryte ned komplekse SQL-spørringer i mindre som gjør det enkelt å feilsøke og behandle komplekse spørringer.
- SQL WITH-leddet er i utgangspunktet en drop-in-erstatning til den normale underspørringen.