a szoftverfejlesztés, ez a bevett gyakorlat, hogy a csoport utasításokat, mint a kis, könnyen érthető egységek – nevezetesen funkciók vagy módszerek. Ezáltal a kód újrafelhasználható, és javítja az olvashatóságot.
annak ellenére, hogy az SQL-nek is vannak funkciói és eljárásai, nem a megfelelő eszközök a könnyen érthető és újrafelhasználható egységek építéséhez. Az SQL-ben sem a funkciók, sem az eljárások nem első osztályú állampolgárok ugyanúgy, mint az alkeretek.0 az SQL építőköve queries1-nem utasítások.,
ahhoz, hogy a lekérdezések újrafelhasználhatók legyenek, az SQL-92 bevezette a nézeteket. A létrehozás után a nézetnek van egy neve az adatbázis sémájában, hogy más lekérdezések táblázatként használhassák.
SQL: 1999 added the with
clause to define”statement scoped views”. Ezek nem tárolódnak az adatbázis sémájában: ehelyett csak abban a lekérdezésben érvényesek, amelyhez tartoznak. Ez lehetővé teszi a nyilatkozat szerkezetének javítását anélkül, hogy szennyezné a globális névteret.,
szintaxis
a with
záradék, egyszerűen fogalmazva, egy opcionális előtag a select
:2
WITH query_name (column_name1, ...) AS (SELECT ...) SELECT ...
a with
ugyanaz, mint acreate view
: a lekérdezés nevével kezdődik, optionally3, zárójelben pedig az oszlopok nevét adja vissza. A as
kulcsszó végül bemutatja magát a meghatározást (a lekérdezést)—ismét zárójelben.,
With
nem önálló parancs, mint például a create view
is: ezt a select
követnie kell. Ez a lekérdezés (és a benne lévő alkeretek) a from
záradékban a megadott lekérdezés nevére utalhat.
egyetlen with
záradék több lekérdezési nevet is bevezethet vesszővel elválasztva (a with
kulcsszó nem ismétlődik meg)., Mindegyik lekérdezés a with
clause4 (gyakran elhanyagolt szabály—lásd a kompatibilitást) alatt korábban meghatározott lekérdezési nevekre utalhat:
WITH query_name1 AS ( SELECT ... ) , query_name2 AS ( SELECT ... FROM query_name1 ... )SELECT ...
lekérdezési nevek a with
maszkolja a meglévő táblákat vagy az azonos nevű nézeteket.5
teljesítmény megfontolások
a legtöbb adatbázis feldolgozza a with
-lekérdezéseket ugyanúgy, ahogy a nézeteket feldolgozzák: a lekérdezésre való hivatkozást a definíciójával helyettesítik, és optimalizálják a teljes lekérdezést.,
a PostgreSQL adatbázis egészen a 12-es verzióig más volt: minden with
lekérdezést és egymástól független fő állítást optimalizált.
Ha a with
lekérdezés utal többször, egyes adatbázisok cache (azaz” materialize”) annak eredménye, hogy megakadályozzák a kettős végrehajtás.
Tudjon meg többet erről a “with
záradék: teljesítmény hatások”.
saját nevemben
képzésből, más SQL-hez kapcsolódó szolgáltatásokból és könyvem eladásából élek. További információ: https://winand.at/.,
használati Esetek
-
Művelt SQL
-
Unit tesztet tranziens adatok
-
Rendel neveket oszlopok nélkül egy ismert név
Kompatibilitás
A with
záradék vezették be az SQL:1999, mint egy készlet opcionális funkciók. Arecursive
változat mellett a t121 a felső szintűwith
és a t122 awith
alkönyvtárakban.
awith
alapvető funkcionalitása jól támogatott., Az egyetlen terület, ahol a termékek másképp viselkednek, a névfelbontás. Különösen figyelemre méltó, hogy a with
gyakran úgy kezelik, mint a with recursive
.6 a finomabb inkompatibilitások a minősített táblázatnevekhez kapcsolódnak (schema.table
nem hivatkozhat a with
lekérdezésre)7 és a with
lekérdezések hatókörében használt nézetek (a nézetben található lekérdezés nem “látja” a külső with
záradék).,8
megfelelő alternatívák
nézetek kiterjedhet néhány használati esetek. Ez azonban könnyen vezethet ésszerűtlen számú nézethez (“névtér szennyezés”). Ezekben az esetekben az alkeretek gyakran a jobb megoldás.
szabadalmaztatott kiterjesztések
as DML előtaggal (PostgreSQL, SQL Server, SQLite)
egyes adatbázisok elfogadják awith
A DML utasítások előtagjaként (docs: PostgreSQL, SQL Server, SQLite).,
SQL Server is használhatja a with
lekérdezés, mint a cél a DML nyilatkozatok (alapvetően épület egy frissíthető nézet).
funkciók in with (Oracle)
Az Oracle adatbázis a with
12cr1-es verzió óta támogatja a függvény-és eljárásnyilatkozatokat (dokumentáció).
DML in with (PostgreSQL)
9.1-től kezdődően a PostgreSQL adatbázis támogatja a DML kimutatásokat (insert
, update
, delete
) a with
lekérdezések (dokumentáció)., A (szintén védett) returning
A DML-nyilatkozat záradékának használatakor a with
lekérdezés valójában adatokat ad vissza (például az éppen beillesztett sorokat).