med – Organisere Komplekse Forespørgsler

med – Organisere Komplekse Forespørgsler

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *