Klauzula SQL WITH bola zavedená spoločnosťou Oracle v databáze Oracle 9i release 2. Klauzula SQL WITH vám umožňuje pomenovať blok poddotazu (proces nazývaný aj refaktoring poddotazu), na ktorý možno odkazovať na niekoľkých miestach v rámci hlavného dotazu SQL.
- Klauzula sa používa na definovanie dočasného vzťahu tak, že výstup tohto dočasného vzťahu je dostupný a používa ho dotaz, ktorý je spojený s klauzulou WITH.
- Dotazy, ktoré majú priradenú klauzulu WITH, možno písať aj pomocou vnorených poddotazov, ale tým sa zvyšuje zložitosť čítania/ladenia dotazu SQL.
- Klauzula WITH nie je podporovaná všetkými databázovými systémami.
- S názvom priradeným poddotazu sa zaobchádza, ako keby to bol vložený pohľad alebo tabuľka
- Klauzula SQL WITH bola zavedená spoločnosťou Oracle v databáze Oracle 9i release 2.
Syntax:
WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table) SELECT Attr1 FROM Table, temporaryTable WHERE Table.Attr1>dočasnáTabuľka.averageValue;>

čiastočná závislosť
V tomto dotaze sa klauzula WITH používa na definovanie dočasného vzťahu dočasná tabuľka, ktorá má iba 1 atribút averageValue. averageValue obsahuje priemernú hodnotu stĺpca Attr1 opísanú vo vzťahu Tabuľka. Príkaz SELECT, ktorý nasleduje za klauzulou WITH, vytvorí len tie n-tice, ktorých hodnota Attr1 vo vzťahu Table je väčšia ako priemerná hodnota získaná z príkazu klauzuly WITH.
Poznámka: Keď sa vykoná dotaz s klauzulou WITH, najskôr sa vyhodnotí dotaz uvedený v klauzule a výstup tohto vyhodnotenia sa uloží v dočasnom vzťahu. Potom sa nakoniec vykoná hlavný dotaz spojený s klauzulou WITH, ktorý použije vytvorený dočasný vzťah.
Dotazy
js pole
Príklad 1: Nájdite všetkých zamestnancov, ktorých plat je vyšší ako priemerný plat všetkých zamestnancov.
Názov vzťahu: zamestnanec
| Identifikačné číslo zamestnanca | názov | Plat |
|---|---|---|
| 100011 | Smith | 50 000 |
| 100022 | Bill | 94 000 |
| 100027 | Sám seba | 70550 |
| 100845 | Walden | 80 000 |
| 115585 | Erik | 60 000 |
| 1100070 | Kate | 69 000 |
SQL dotaz:
WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee) SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary>dočasnéTable.averageValue;>
Výkon:
| Identifikačné číslo zamestnanca | názov | Plat |
|---|---|---|
| 100022 | Bill | 94 000 |
| 100845 | Walden | 80 000 |
Vysvetlenie: Priemerná mzda všetkých zamestnancov je 70591. Vo výkonovej relácii teda ležia všetci zamestnanci, ktorých mzda je vyššia ako získaný priemer.
Príklad 2: Nájdite všetky letecké spoločnosti, ktorých celkový plat všetkých pilotov danej leteckej spoločnosti je vyšší ako priemer celkových platov všetkých pilotov v databáze.
Názov vzťahu: Pilot
koliesko myši sa neposúva správne
| Identifikačné číslo zamestnanca | letecká spoločnosť | názov | Plat |
|---|---|---|---|
| 70007 | Airbus 380 | Kim | 60 000 |
| 70002 | Boeing | Laura | 20 000 |
| 10027 | Airbus 380 | Will | 80050 |
| 10778 | Airbus 380 | Warren | 80780 |
| 115585 | Boeing | Smith | 25 000 |
| 114070 | Airbus 380 | Katy | 78 000 |
SQL dotaz:
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;>
Výkon:
| letecká spoločnosť |
|---|
| Airbus 380 |
Vysvetlenie: Celkový plat všetkých pilotov Airbusu 380 = 298 830 a Boeingu = 45000. Priemerný plat všetkých pilotov v tabuľke Pilot = 57305. Keďže iba celkový plat všetkých pilotov Airbusu 380 je väčší ako získaný priemerný plat, tak Airbus 380 leží vo výkonovom vzťahu.
Dôležité body:
- Klauzula SQL WITH je dobrá, keď sa používa s komplexnými príkazmi SQL, a nie s jednoduchými
- Umožňuje vám tiež rozdeliť zložité dotazy SQL na menšie, čo uľahčuje ladenie a spracovanie zložitých dotazov.
- Klauzula SQL WITH je v podstate náhradou za normálny poddotaz.