sql >> Database teknologi >  >> RDS >> Database

Almindelige tabeludtryk:Hvornår og hvordan man bruger dem

Hvad er almindelige tabeludtryk (CTE'er)?

Et Common Table Expression (CTE) er resultatet af en forespørgsel, som eksisterer midlertidigt og kun til brug i sammenhæng med en større forespørgsel. På samme måde som en afledt tabel gemmes resultatet af en CTE ikke og eksisterer kun i forespørgslens varighed. Denne artikel vil fokusere på ikke-rekursive CTE'er.

Hvordan er CTE'er nyttige?

CTE'er, som databasevisninger og afledte tabeller, gør det muligt for brugere lettere at skrive og vedligeholde komplekse forespørgsler via øget læsbarhed og forenkling. Denne reduktion i kompleksitet opnås ved at dekonstruere almindeligt komplekse forespørgsler til simple blokke, der skal bruges og genbruges om nødvendigt ved omskrivning af forespørgslen. Eksempler på brug omfatter:

  • Behov for at referere til en afledt tabel flere gange i en enkelt forespørgsel
  • Et alternativ til at oprette en visning i databasen
  • Udførelse af den samme beregning flere gange på tværs af flere forespørgselskomponenter

Sådan opretter du en CTE

  • Start en CTE ved hjælp af "WITH"
  • Angiv et navn til resultatforespørgslen, som snart skal defineres
  • Når du har tildelt et navn, følg med "AS"
  • Angiv kolonnenavne (valgfrit trin)
  • Definer forespørgslen for at producere det ønskede resultatsæt
  • Hvis der kræves flere CTE'er, skal du starte hvert efterfølgende udtryk med et komma og gentage trin 2-4.
  • Referer til ovennævnte CTE(er) i en efterfølgende forespørgsel

Syntaks

WITH
expression_name_1 AS
(CTE query definition 1)

[, expression_name_X AS
   (CTE query definition X)
 , etc ]

SELECT expression_A, expression_B, ...
FROM expression_name_1

##Eksempel CTE Følgende forespørgsel besvarer forretningsspørgsmålet:"hvad er den gennemsnitlige månedlige pris pr. kampagne for virksomhedens marketingindsats?" Dette kunne opnås med en afledt forespørgsel (vist nedenfor); Brug af en CTE forbedrer dog læsbarheden

-- define CTE:
WITH Cost_by_Month AS
(SELECT campaign_id AS campaign,
       TO_CHAR(created_date, 'YYYY-MM') AS month,
       SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2)

-- use CTE in subsequent query:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM Cost_by_Month
GROUP BY campaign
ORDER BY campaign

Brug af en afledt forespørgsel:

SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM
    -- this is where the derived query is used
    (SELECT campaign_id AS campaign,
       TO_CHAR(created_date, 'YYYY-MM') AS month,
       SUM(cost) AS monthly_cost
    FROM marketing
    WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
    GROUP BY 1, 2
    ORDER BY 1, 2) as Cost_By_Month
GROUP BY campaign
ORDER BY campaign

Dokumentation

  • Postgres
  • Rødskift
  • Oracle
  • SQLServer

  1. Cloud Vendor Deep-Dive:PostgreSQL på DigitalOcean

  2. Top Facebook-grupper til Analytics, Big Data, Data Mining, Hadoop, NoSQL, Data Science

  3. Hvordan ændrer jeg kolonnens standardværdi i PostgreSQL?

  4. Sammenligning af datoer i Oracle SQL