cu – organizați interogări complexe

cu – organizați interogări complexe

î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).

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *