PostgreSQL - MED Clause

I PostgreSQL, gir med Query en måte å skrive tilleggsregnskap for bruk i et større søk. Det hjelper i å bryte ned kompliserte og store spørsmål i enklere former, som er lett lesbar. Disse uttalelsene, som ofte omtales som tabelluttrykk eller CTEs, kan betraktes som å definere midlertidige tabeller som eksisterer bare for en spørring.

MED spør være CTE spørring, er spesielt nyttig når delspørring utføres flere ganger. Det er like nyttig i stedet for midlertidige tabeller. Den beregner aggregering gang og gir oss mulighet til å referere til den ved sitt navn (kan være flere ganger) i spørringer.

MED klausulen må defineres før den brukes i søket

Syntax.

Den grunnleggende syntaks MED spørringen er som følger:
MED name_for_summary_data AS (SELECT Statement) velge kolonnene fra name_for_summary_data der forholdene <=> (velg kolonne FROM name_for_summary_data) [ORDER BY kolonner]

Hvor name_for_summary_data
er navnet gitt til med punkt. Den name_for_summary_data kan være det samme som en eksisterende tabell navn og har forrang.

Du kan bruke datamodifiserende uttalelser (INSERT, UPDATE eller DELETE) i MED. Dette gjør at du kan utføre flere ulike operasjoner i samme søket.

rekursiv med
rekursiv med eller Hierarkiske spørringer, er en form for CTE hvor en CTE kan referere til seg selv, dvs. en MED spørring kan referere til sin egen utgang, derav navnet rekursive
Eksempel

Tenk bordet COMPANY ha poster som følger:.
testdb # select * from COMPANY; id | Navn | alder | adressere | lønn ---- + ------- + ----- + ----------- + -------- 1 | Paul | 32 | California | 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norge | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | Sør-Hall | 45000 7 | James | 24 | Houston | 10000 (7 p)

Nå, la oss skrive en spørring ved hjelp WITH klausul for å velge poster fra tabellen ovenfor, som følger:
Med CTE AS (Velg ID, navn, alder, adresse, SALARYFROM COMPANY) Velg * Fra CTE;

Over PostgreSQL uttalelse vil produsere følgende resultat:
id | Navn | alder | adressere | lønn ---- + ------- + ----- + ----------- + -------- 1 | Paul | 32 | California | 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norge | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | Sør-Hall | 45000 7 | James | 24 | Houston | 10000 (7 p)

Nå, la oss skrive en spørring ved hjelp av rekursive søkeord sammen med MED klausulen, for å finne summen av lønn mindre enn 20 000, som følger:
MED rekursiv t (n) AS ( VERDIER (0) UNION ALL SELECT lønn fra bedriften der LØNN

Over PostgreSQL uttalelse vil produsere følgende resultat:
sum ------- 25000 (1 p)

La oss skrive en spørring ved hjelp av data modifisere uttalelser sammen med MED klausulen, som følger. Først lager en tabell COMPANY1 ligner på bordet COMPANY. Spørringen i eksempelet, flytter effektivt rader fra selskap til COMPANY1. Den DELETE i MED sletter de angitte rader fra COMPANY, returnerer innholdet ved hjelp av sin RETURNERER klausul, og deretter den primære spør leser at produksjonen og setter den inn COMPANY1 TABELL:
CREATE TABLE COMPANY1 (ID INT PRIMARY KEY NOT NULL, NAME TEKST NOT NULL, AGE INT NOT NULL, ADRESSE CHAR (50 ), LØNN REAL); MED moved_rows AS (DELETE FROM selskap hvor LØNN > = 30000 RETURNERER *) INSERT INTO COMPANY1 (SELECT * FROM moved_rows);

Over PostgreSQL uttalelse vil produsere følgende resultat:
SETT 0 3

Nå poster i tabeller COMPANY og COMPANY1 er som følger:
testdb = # SELECT * FROM COMPANY; id | Navn | alder | adressere | lønn ---- + ------- + ----- + ------------ + -------- 1 | Paul | 32 | California | 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norge | 20000 7 | James | 24 | Houston | 10000 (4 rader) testdb = # SELECT * FROM COMPANY1; id | Navn | alder | adressere | lønn ---- + ------- + ----- + ------------- + -------- 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | Sør-Hall | 45000 (3 rader)