I software engineering er det almindelig praksis, at gruppen instruktioner som lille og let forståelige enheder—nemlig funktioner eller metoder. Dette gør koden genanvendelig og forbedrer læsbarheden.
selvom s .l også har funktioner og procedurer, er de ikke de rigtige værktøjer til opbygning af let forståelige og genanvendelige enheder. I S .l er hverken funktioner eller procedurer førsteklasses borgere på samme måde som underforespørgsler er.0 byggestenen i S .l er forespørgsler1—ikke instruktioner.,
for at gøre forespørgsler genanvendelige introducerede s .l-92 visninger. Når den er oprettet, har en visning et navn i databaseskemaet, så andre forespørgsler kan bruge det som en tabel.s .l: 1999 tilføjede with
klausul for at definere “statement scoped vie .s”. De gemmes ikke i databaseskemaet: i stedet er de kun gyldige i den forespørgsel, de tilhører. Dette gør det muligt at forbedre strukturen i en erklæring uden at forurene det globale navneområde.,
Syntaks
with
klausul er, kort sagt, en valgfri præfiks for select
:2
WITH query_name (column_name1, ...) AS (SELECT ...) SELECT ...
syntaks efter søgeord with
er det samme som det er for create view
: det starter med forespørgslen navn, og optionally3 og i parentes navnet på den kolonne, den returnerer. Nøgleordet as
introducerer endelig selve definitionen (forespørgslen)—igen i parentes.,
With
er ikke en enkeltstående kommando-f.eks. create view
er: det skal være efterfulgt af select
. Denne forespørgsel (og underforespørgsler den indeholder) kan henvise til det netop definerede forespørgselsnavn i deres from
klausul.
en enkeltwith
klausul kan introducere flere forespørgselsnavne ved at adskille dem med et komma (with
nøgleord gentages ikke)., Hver enkelt af disse forespørgsler kan henvise til forespørgsel navne, der tidligere er defineret i det samme with
clause4 (en ofte overset-reglen—se Kompatibilitet):
WITH query_name1 AS ( SELECT ... ) , query_name2 AS ( SELECT ... FROM query_name1 ... )SELECT ...
Query navne, der er defineret ved hjælp af with
maske eksisterende tabeller eller visninger med samme navn.5
Ydelsesovervejelser
de fleste databaser behandlerwith
-forespørgsler på samme måde som de behandler Visninger: de erstatter henvisningen til forespørgslen med dens definition og optimerer den samlede forespørgsel.,
Postgres .l-databasen var forskellig indtil version 12: Den optimerede hver with
forespørgsel og hovederklæringen uafhængig af hinanden.
Hvis en with
forespørgsel henvises til flere gange, nogle databaser cache (dvs. “materialisere”) dens resultat for at forhindre dobbelt udførelse.
Læs mere om dette i “with
Klausul: Performance Impacts”.
på egne vegne
lever jeg af træning, andre s .l-relaterede tjenester og sælger min bog. Læs mere på https://winand.at/.,
brugssager
-
Literate SLL
-
enhedstest på transient data
-
Tildel navne til kolonner uden kendt navn
Kompatibilitet
with
klausul blev introduceret med s .l:1999 som et sæt valgfrie funktioner. Forlader recursive
variant til side, de funktioner er T121 for top-niveau with
klausuler og T122 for with
klausuler i underforespørgsler.
den grundlæggende funktionalitet af with
er godt understøttet., Det eneste område, hvor produkter opfører sig anderledes, er navneopløsning. Det er især bemærkelsesværdigt, at with
ofte behandles som with recursive
.6 de mere subtile uforeneligheder er relateret til kvalificerede tabelnavne (schema.table
kan ikke henvise til en with
forespørgsel)7 og visninger, der bruges inden for rammerne af with
forespørgsler (forespørgslen inde i visningen “ser ikke” den ydre with
klausul).,8
overensstemmende alternativer
visninger kan dække nogle af brugssagerne. Dette kan dog let føre til et urimeligt Antal visninger (“namespace forurening”). I disse tilfælde er underforespørgsler ofte den bedre mulighed.
Proprietære Udvidelser
med som DML præfiks (PostgreSQL, SQL Server, SQLite)
Nogle databaser acceptere with
som et præfiks til DML-sætninger (dokumenter: PostgreSQL, SQL Server, SQLite).,
s .l Server kan også bruge en with
forespørgsel som et mål for DML-sætninger (grundlæggende opbygning af en opdaterbar visning).
Funktioner med (Oracle)
Oracle Database understøtter funktionen og procedure-erklæringer i with
bestemmelse, da version 12cR1 (dokumentation).
DML med (PostgreSQL)
Start med 9,1, PostgreSQL database understøtter DML-sætninger (insert
update
delete
) i kroppen af with
forespørgsler (dokumentation)., Når du bruger (også proprietære) returning
klausulen i DML-sætningen, returnerer with
forespørgslen faktisk data (f.eks. rækkerne lige indsat).