Klauzula SQL WITH została wprowadzona przez firmę Oracle w bazie danych Oracle 9i w wersji 2. Klauzula SQL WITH umożliwia nadanie blokowi podzapytania nazwy (proces zwany także refaktoryzacją podzapytania), do której można się odwoływać w kilku miejscach głównego zapytania SQL.
- Klauzula służy do definiowania relacji tymczasowej w taki sposób, że wynik tej relacji tymczasowej jest dostępny i jest używana przez zapytanie powiązane z klauzulą WITH.
- Zapytania, które mają powiązaną klauzulę WITH, można również pisać przy użyciu zagnieżdżonych podzapytań, ale powoduje to większą złożoność odczytu/debugowania zapytania SQL.
- Klauzula WITH nie jest obsługiwana przez wszystkie systemy baz danych.
- Nazwa przypisana do zapytania podrzędnego jest traktowana tak, jakby była widokiem wbudowanym lub tabelą
- Klauzula SQL WITH została wprowadzona przez firmę Oracle w bazie danych Oracle 9i w wersji 2.
Składnia:
WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table) SELECT Attr1 FROM Table, temporaryTable WHERE Table.Attr1>tabela tymczasowa.średniawartość;>

3 miesiące
W tym zapytaniu klauzula WITH służy do zdefiniowania tymczasowej relacji TemporaryTable, która ma tylko 1 atrybut AverageValue. AverageValue przechowuje średnią wartość kolumny Attr1 opisaną w relacji Tabela. Instrukcja SELECT występująca po klauzuli WITH zwróci tylko te krotki, w których wartość Attr1 w relacji Table jest większa niż średnia wartość uzyskana z instrukcji klauzuli WITH.
Notatka: Kiedy wykonywane jest zapytanie z klauzulą WITH, najpierw oceniane jest zapytanie wymienione w klauzuli, a wynik tej oceny jest przechowywany w relacji tymczasowej. Następnie zostaje ostatecznie wykonane główne zapytanie powiązane z klauzulą WITH, które wykorzystuje utworzoną tymczasową relację.
Zapytania
znak na int w Javie
Przykład 1: Znajdź wszystkich pracowników, których wynagrodzenie jest wyższe niż średnie wynagrodzenie wszystkich pracowników.
Nazwa relacji: Pracownik
| Dowód pracownika | Nazwa | Wynagrodzenie |
|---|---|---|
| 100011 | Kowal | 50000 |
| 100022 | Rachunek | 94000 |
| 100027 | samego siebie | 70550 |
| 100845 | Waldena | 80000 |
| 115585 | Eryk | 60000 |
| 1100070 | Kate | 69000 |
Zapytanie SQL:
WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee) SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary>tabela tymczasowa.średniaWartość;>
Wyjście:
| Dowód pracownika | Nazwa | Wynagrodzenie |
|---|---|---|
| 100022 | Rachunek | 94000 |
| 100845 | Waldena | 80000 |
Wyjaśnienie: Przeciętne wynagrodzenie wszystkich pracowników wynosi 70591. Zatem wszyscy pracownicy, których wynagrodzenie jest wyższe od uzyskanej średniej, mieszczą się w relacji produkcji.
Przykład 2: Znajdź wszystkie linie lotnicze, w których łączne wynagrodzenie wszystkich pilotów w tej linii jest wyższe niż średnia łącznego wynagrodzenia wszystkich pilotów w bazie danych.
Nazwa relacji: Pilot
Java elseif
| Dowód pracownika | Linia lotnicza | Nazwa | Wynagrodzenie |
|---|---|---|---|
| 70007 | Airbusa 380 | Kima | 60000 |
| 70002 | Boeinga | Laura | 20000 |
| 10027 | Airbusa 380 | Będzie | 80050 |
| 10778 | Airbusa 380 | Królikarnia | 80780 |
| 115585 | Boeinga | Kowal | 25000 |
| 114070 | Airbusa 380 | Katy | 78000 |
Zapytanie 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>linia lotniczaŚrednia.avgWynagrodzenie;>
Wyjście:
| Linia lotnicza |
|---|
| Airbusa 380 |
Wyjaśnienie: Łączne wynagrodzenie wszystkich pilotów Airbusa 380 = 298 830 i Boeinga = 45000. Średnie wynagrodzenie wszystkich pilotów w tabeli Pilot = 57305. Ponieważ tylko łączne wynagrodzenie wszystkich pilotów Airbusa 380 jest większe od przeciętnego uzyskiwanego wynagrodzenia, zatem Airbus 380 leży w relacji wyjściowej.
Ważne punkty:
- Klauzula SQL WITH jest dobra, gdy jest używana ze złożonymi instrukcjami SQL, a nie prostymi
- Umożliwia także podzielenie złożonych zapytań SQL na mniejsze, co ułatwia debugowanie i przetwarzanie złożonych zapytań.
- Klauzula SQL WITH jest w zasadzie zamiennikiem zwykłego zapytania podrzędnego.