De SQL WITH-clausule is door Oracle geïntroduceerd in de Oracle 9i release 2-database. Met de SQL WITH-clausule kunt u een subqueryblok een naam geven (een proces dat ook wel subquery-refactoring wordt genoemd), waarnaar op verschillende plaatsen binnen de SQL-hoofdquery kan worden verwezen.
- De clausule wordt gebruikt voor het definiëren van een tijdelijke relatie, zodat de uitvoer van deze tijdelijke relatie beschikbaar is en wordt gebruikt door de query die is gekoppeld aan de WITH-clausule.
- Query's waaraan een WITH-clausule is gekoppeld, kunnen ook worden geschreven met behulp van geneste subquery's, maar dit voegt meer complexiteit toe bij het lezen/debuggen van de SQL-query.
- WITH-clausule wordt niet door alle databasesystemen ondersteund.
- De naam die aan de subquery is toegewezen, wordt behandeld alsof het een inlineweergave of tabel is
- De SQL WITH-clausule is door Oracle geïntroduceerd in de Oracle 9i release 2-database.
Syntaxis:
WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table) SELECT Attr1 FROM Table, temporaryTable WHERE Table.Attr1>tijdelijkeTabel.averageValue;>
In deze query wordt de WITH-clausule gebruikt om een tijdelijke relatie TemporaryTable te definiëren die slechts één attribuut AverageValue heeft. AverageValue bevat de gemiddelde waarde van kolom Attr1, beschreven in relatietabel. De SELECT-instructie die volgt op de WITH-clausule zal alleen die tupels produceren waarbij de waarde van Attr1 in relatie Table groter is dan de gemiddelde waarde die wordt verkregen uit de WITH-clausule-instructie.
Opmerking: Wanneer een query met een WITH-clausule wordt uitgevoerd, wordt eerst de in de clausule genoemde query geëvalueerd en wordt de uitvoer van deze evaluatie opgeslagen in een tijdelijke relatie. Hierna wordt uiteindelijk de hoofdquery die is gekoppeld aan de WITH-clausule uitgevoerd, waarbij gebruik wordt gemaakt van de geproduceerde tijdelijke relatie.
Vragen
Voorbeeld 1: Vind alle werknemers wiens salaris hoger is dan het gemiddelde salaris van alle werknemers.
Naam van de relatie: Medewerker
MedewerkerID | Naam | Salaris |
---|---|---|
100011 | Smit | 50000 |
100022 | Rekening | 94000 |
100027 | Zichzelf | 70550 |
100845 | Walden | 80000 |
115585 | Erik | 60000 |
1100070 | Kate | 69000 |
SQL-query:
WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee) SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary>tijdelijketabel.gemiddeldewaarde;>
Uitgang:
MedewerkerID | Naam | Salaris |
---|---|---|
100022 | Rekening | 94000 |
100845 | Walden | 80000 |
Uitleg: Het gemiddelde salaris van alle medewerkers is 70591. Daarom liggen alle medewerkers waarvan het salaris hoger is dan het verkregen gemiddelde in de outputrelatie.
Voorbeeld 2: Vind alle luchtvaartmaatschappijen waar het totale salaris van alle piloten bij die luchtvaartmaatschappij hoger is dan het gemiddelde van het totale salaris van alle piloten in de database.
Naam van de relatie: Piloot
MedewerkerID | Luchtvaartmaatschappij | Naam | Salaris |
---|---|---|---|
70007 | Luchtbus 380 | Kim | 60000 |
70002 | Boeing | Laura | 20000 |
10027 | Luchtbus 380 | Zullen | 80050 |
10778 | Luchtbus 380 | Warren | 80780 |
115585 | Boeing | Smit | 25000 |
114070 | Luchtbus 380 | Katja | 78000 |
SQL-query:
katrina kaif
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;>
Uitgang:
Luchtvaartmaatschappij |
---|
Luchtbus 380 |
Uitleg: Het totale salaris van alle piloten van Airbus 380 = 298.830 en dat van Boeing = 45000. Gemiddeld salaris van alle piloten in de tabel Piloot = 57305. Aangezien alleen het totale salaris van alle piloten van Airbus 380 groter is dan het gemiddeld behaalde salaris, dus Airbus 380 ligt in de outputrelatie.
Belangrijke punten:
- De SQL WITH-clausule is goed bij gebruik met complexe SQL-instructies in plaats van eenvoudige
- Hiermee kunt u ook complexe SQL-query's opsplitsen in kleinere, waardoor het debuggen en verwerken van de complexe query's gemakkelijk wordt.
- De SQL WITH-clausule is in feite een drop-in-vervanging van de normale subquery.