în ingineria software, este o practică obișnuită gruparea instrucțiunilor ca unități mici și ușor de înțeles—și anume funcții sau metode. Acest lucru face ca Codul să fie reutilizabil și îmbunătățește lizibilitatea.chiar dacă SQL are funcții și proceduri, de asemenea, ele nu sunt instrumentele potrivite pentru construirea de unități ușor de înțeles și reutilizabile. În SQL, nici funcțiile, nici procedurile nu sunt cetățeni de primă clasă în același mod în care sunt subqueries.0 blocul de construcție al SQL sunt interogări1-nu instrucțiuni.,pentru a face interogările reutilizabile, SQL – 92 a introdus vizualizări. Odată creat, o vizualizare are un nume în schema bazei de date, astfel încât alte interogări să o poată folosi ca un tabel.
SQL:1999, a adăugat with
clauza de a defini „declarație luneta vedere”. Ele nu sunt stocate în schema bazei de date: în schimb, ele sunt valabile numai în interogarea din care fac parte. Acest lucru face posibilă îmbunătățirea structurii unei declarații fără a polua spațiul de nume global.,
Sintaxa
with
clauză este, pur și simplu pune, un prefix opțional pentru select
:2
WITH query_name (column_name1, ...) AS (SELECT ...) SELECT ...
sintaxa după cuvinte cheie with
este la fel cum este pentru create view
: se începe cu numele de interogare, și optionally3 și în paranteză numele de coloane se întoarce. Cuvântul cheie as
introduce în sfârșit definiția în sine (interogarea)—din nou în paranteze.,
With
nu este un singur stand de comandă cum ar fi create view
este: trebuie să fie urmată de select
. Această interogare (și subcategoriile pe care le conține) se poate referi la numele de interogare tocmai definit în clauza from
.
o singură clauză with
poate introduce mai multe nume de interogare separându-le cu o virgulă (cuvântul cheie with
nu se repetă)., Fiecare dintre aceste întrebări se poate referi la interogare nume definite anterior în cadrul aceleiași with
clause4 (o de multe ori neglijat regula—vezi Compatibilitate):
WITH query_name1 AS ( SELECT ... ) , query_name2 AS ( SELECT ... FROM query_name1 ... )SELECT ...
Interogare nume definite folosind with
masca existente tabele sau vederi cu același nume.5
considerații de performanță
majoritatea bazelor de date procesează with
-interogări în același mod în care procesează vizualizări: înlocuiesc referința la interogare prin definiția sa și optimizează interogarea generală.,
baza de date PostgreSQL a fost diferită până la versiunea 12: a optimizat fiecare interogarewith
și declarația principală independentă una de cealaltă.
dacă o with
interogare este menționată de mai multe ori, unele baze de date cache (de exemplu, „materializa”) rezultatul său pentru a preveni executarea dublă.
citiți mai multe despre acest lucru în „with
Clauză: impact asupra performanței”.
în numele meu
îmi câștig existența din formare, alte servicii legate de SQL și vânzarea cărții mele. Aflați mai multe la https://winand.at/.,
Cazuri de Utilizare
-
știință de carte SQL
-
teste Unitare pe tranzitorii de date
-
se Atribuie nume de coloane, fără un nume cunoscut
Compatibilitate
with
clauză a fost introdusă cu SQL:1999 ca un set de caracteristici opționale. Lăsând recursive
varianta deoparte, caracteristicile sunt T121 pentru top-level with
clauze și T122 pentru with
clauze în subinterogări.
funcționalitatea de bază a with
este bine susținută., Singura zonă în care produsele se comportă diferit este rezoluția numelui. Este deosebit de demn de remarcat faptul că with
este adesea tratat ca with recursive
.6 mai subtile incompatibilități sunt legate de calificat tabelul nume (schema.table
nu se poate referi la un with
query)7 și vederi utilizate în domeniul de aplicare al with
interogări (query în vedere nu „vedea” exterior with
clauza).,8
Alternative conforme
vizualizări pot acoperi unele dintre cazurile de utilizare. Cu toate acestea, acest lucru poate duce cu ușurință la un număr nerezonabil de vizualizări („poluarea spațiului de nume”). În aceste cazuri, subqueries sunt adesea opțiunea mai bună.unele baze de date acceptă with
ca prefix pentru declarațiile DML (docs: PostgreSQL, SQL Server, SQLite).,
SQL Server poate folosi, de asemenea, o with
interogare ca țintă pentru declarațiile DML (practic construirea unei vizualizări actualizabile).
funcționează cu (Oracle)
Oracle Database acceptă declarațiile de funcții și proceduri în cadrul clauzeiwith
de la versiunea 12cr1 (documentație).
DML în cu (PostgreSQL)
Incepand cu 9.1, baze de date PostgreSQL suportă DML declarații (insert
, update
, delete
) în corpul with
interogări (documentație)., Atunci când se utilizează (de asemenea, de proprietate) returning
clauza de DML, with
interogare de fapt, se întoarce de date (de exemplu rânduri inserate).