kvadratet med klausul blev introduceret af Oracle i Oracle 9i release 2-databasen. Med klausulen kan du give en underforespørgselblok et navn (en proces, der også kaldes underforespørgsel refactoring), som kan refereres flere steder i HOVEDFORESPØRGSLEN.
- klausulen bruges til at definere en midlertidig relation, således at output fra denne midlertidige relation er tilgængelig og bruges af den forespørgsel, der er knyttet til med-klausulen.
- forespørgsler, der har en tilknyttet klausul, kan også skrives ved hjælp af indlejrede underforespørgsler, men det gør det mere kompliceret at læse/debugge forespørgslen.
- med klausul understøttes ikke af alle databasesystemer.
- det navn, der er tildelt underforespørgslen, behandles som om det var en inline-visning eller tabel
- SL med klausul blev introduceret af Oracle i Oracle 9i release 2-databasen.
syntaks:
WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table), SELECT Attr1 FROM Table WHERE Table.Attr1 > temporaryTable.averageValue;
i denne forespørgsel bruges klausul til at definere en midlertidig relation temporarytabel, der kun har 1 attribut averagevalue. averageValue holder den gennemsnitlige værdi af kolonne Attr1 beskrevet i relationstabel. SELECT-sætningen, der følger med-klausulen, producerer kun de tupler, hvor værdien af Attr1 i relationstabellen er større end den gennemsnitlige værdi opnået fra sætningen med-klausul.
Bemærk: Når en forespørgsel med en med-klausul udføres, evalueres først den forespørgsel, der er nævnt i klausulen, og output fra denne evaluering gemmes i en midlertidig relation. Herefter udføres hovedforespørgslen, der er knyttet til med-klausulen, endelig, der bruger den producerede midlertidige relation.
forespørgsler
eksempel 1: Find alle medarbejdere, hvis løn er mere end gennemsnitslønnen for alle medarbejdere.
navn på forholdet: Employee
EmployeeID | Name | Salary |
---|---|---|
100011 | Smith | 50000 |
100022 | Bill | 94000 |
100027 | Sam | 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 > temporaryTable.averageValue;
Output:
EmployeeID | navn | løn |
---|---|---|
100022 | Bill | 94000 |
100845 | 80000 |
forklaring: Den gennemsnitlige løn for alle medarbejdere er 70591. Derfor ligger alle medarbejdere, hvis løn er mere end det opnåede gennemsnit, i outputforholdet.
eksempel 2: Find alle de flyselskaber, hvor den samlede løn for alle piloter i dette flyselskab er mere end gennemsnittet af den samlede løn for alle piloter i databasen.
navn på forholdet: Pilot
EmployeeID | Airline | Name | Salary |
---|---|---|---|
70007 | Airbus 380 | Kim | 60000 |
70002 | Boeing | Laura | 20000 |
10027 | Airbus 380 | Will | 80050 |
10778 | Airbus 380 | Warren | 80780 |
115585 | Boeing | Smith | 25000 |
114070 | Airbus 380 | Katy | 78000 |
spørgsmål:
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;
Output:
Airbus 380
forklaring: den samlede løn for alle piloter i Airbus 380 = 298.830 og Boeing = 45000. Gennemsnitlig løn for alle piloter i tabellen Pilot = 57305. Da kun den samlede løn for alle piloter i Airbus 380 er større end den opnåede gennemsnitsløn, ligger Airbus 380 i outputforholdet.
vigtige punkter:
- det giver dig også mulighed for at opdele komplekse forespørgsler i mindre, hvilket gør det nemt at debugge og behandle de komplekse forespørgsler.
- det er en drop-in erstatning til den normale underforespørgsel.
Denne artikel er bidraget af Mayank Kumar. Hvis du kan lide GeeksforGeeks og gerne vil bidrage, kan du også skrive en artikel ved hjælp af contribute.geeksforgeeks.org eller send din artikel til [email protected]. Se din artikel vises på GeeksforGeeks hovedsiden og hjælpe andre nørder.