SQL WITH-satsen introducerades av Oracle i Oracle 9i version 2-databasen. SQL WITH-satsen låter dig ge ett sub-query-block ett namn (en process som även kallas sub-query refactoring), som kan refereras till på flera ställen i huvud-SQL-frågan.
k-nn algoritm
- Klausulen används för att definiera en temporär relation så att utdata från denna temporära relation är tillgänglig och används av frågan som är associerad med WITH-satsen.
- Frågor som har en associerad WITH-sats kan också skrivas med hjälp av kapslade underfrågor men gör det mer komplext att läsa/felsöka SQL-frågan.
- WITH-satsen stöds inte av alla databassystem.
- Namnet som tilldelats underfrågan behandlas som om det vore en inlinevy eller tabell
- SQL WITH-satsen introducerades av Oracle i Oracle 9i version 2-databasen.
Syntax:
WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table) SELECT Attr1 FROM Table, temporaryTable WHERE Table.Attr1>temporaryTable.averageValue;>

I den här frågan används WITH-satsen för att definiera en temporär relation temporaryTable som endast har 1 attribut averageValue. medelvärde innehåller medelvärdet för kolumn Attr1 som beskrivs i relationstabell. SELECT-satsen som följer WITH-satsen kommer endast att producera de tuplar där värdet på Attr1 i relationstabellen är större än det genomsnittliga värdet som erhålls från WITH-satssatsen.
Notera: När en fråga med en WITH-sats exekveras, utvärderas först frågan som nämns i satsen och utdata från denna utvärdering lagras i en temporär relation. Efter detta exekveras slutligen huvudfrågan som är associerad med WITH-satsen som skulle använda den framställda temporära relationen.
Frågor
Exempel 1: Hitta alla anställda vars lön är högre än genomsnittslönen för alla anställda.
Namn på relationen: Anställd
| Anställnings-ID | namn | Lön |
|---|---|---|
| 100011 | Smed | 50 000 |
| 100022 | Räkningen | 94 000 |
| 100027 | Han själv | 70550 |
| 100845 | Walden | 80 000 |
| 115585 | Erik | 60 000 |
| 1100070 | Kate | 69 000 |
SQL-fråga:
WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee) SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary>temporaryTable.averageValue;>
Produktion:
| Anställnings-ID | namn | Lön |
|---|---|---|
| 100022 | Räkningen | 94 000 |
| 100845 | Walden | 80 000 |
Förklaring: Medellönen för alla anställda är 70591. Därför ligger alla anställda vars lön är högre än det erhållna genomsnittet i outputrelationen.
Exempel 2: Hitta alla flygbolag där den totala lönen för alla piloter i det flygbolaget är mer än genomsnittet av den totala lönen för alla piloter i databasen.
Namn på relationen: Pilot
| Anställnings-ID | Flygbolag | namn | Lön |
|---|---|---|---|
| 70007 | Airbus 380 | Kim | 60 000 |
| 70002 | Boeing | Laura | 20 000 |
| 10027 | Airbus 380 | Kommer | 80050 |
| 10778 | Airbus 380 | Warren | 80780 |
| 115585 | Boeing | Smed | 25 000 |
| 114070 | Airbus 380 | Katy | 78 000 |
SQL-fråga:
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ön;>
Produktion:
| Flygbolag |
|---|
| Airbus 380 |
Förklaring: Den totala lönen för alla piloter på Airbus 380 = 298 830 och för Boeing = 45 000. Medellön för alla piloter i tabellen Pilot = 57 305. Eftersom endast den totala lönen för alla piloter på Airbus 380 är högre än den erhållna genomsnittslönen, så Airbus 380 ligger i utgångsrelationen.
Viktiga punkter:
- SQL WITH-satsen är bra när den används med komplexa SQL-satser snarare än enkla
- Det låter dig också bryta ner komplexa SQL-frågor i mindre, vilket gör det enkelt att felsöka och bearbeta de komplexa frågorna.
- SQL WITH-satsen är i grunden en drop-in-ersättning till den normala underfrågan.