sql >> Database >  >> RDS >> Database

Algemene tabeluitdrukkingen:wanneer en hoe ze te gebruiken

Wat zijn Common Table Expressions (CTE's)?

Een Common Table Expression (CTE) is de resultatenset van een query die tijdelijk bestaat en alleen voor gebruik binnen de context van een grotere query. Net als bij een afgeleide tabel, wordt het resultaat van een CTE niet opgeslagen en bestaat het alleen voor de duur van de query. Dit artikel gaat over niet-recurrsieve CTE's.

Hoe zijn CTE's nuttig?

CTE's, zoals databaseweergaven en afgeleide tabellen, stellen gebruikers in staat om gemakkelijker complexe query's te schrijven en te onderhouden via een grotere leesbaarheid en vereenvoudiging. Deze reductie in complexiteit wordt bereikt door normaal complexe zoekopdrachten te deconstrueren in eenvoudige blokken die kunnen worden gebruikt, en indien nodig opnieuw worden gebruikt, bij het herschrijven van de zoekopdracht. Voorbeelden van gebruiksscenario's zijn:

  • Meerdere keren naar een afgeleide tabel moeten verwijzen in een enkele zoekopdracht
  • Een alternatief voor het maken van een weergave in de database
  • Dezelfde berekening meerdere keren uitvoeren over meerdere querycomponenten

Een CTE maken

  • Start een CTE met "MET"
  • Geef een naam op voor het resultaat dat binnenkort wordt gedefinieerd
  • Na het toewijzen van een naam, volg met "AS"
  • Specificeer kolomnamen (optionele stap)
  • Definieer de zoekopdracht om de gewenste resultatenset te produceren
  • Als er meerdere CTE's nodig zijn, begin dan elke volgende uitdrukking met een komma en herhaal stap 2-4.
  • Verwijs naar de hierboven gedefinieerde CTE('s) in een volgende zoekopdracht

Syntaxis

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

##Voorbeeld CTEDe volgende vraag beantwoordt de zakelijke vraag:"Wat zijn de gemiddelde maandelijkse kosten per campagne voor de marketinginspanningen van het bedrijf?" Dit zou kunnen worden bereikt met een afgeleide query (hieronder weergegeven); het gebruik van een CTE verbetert echter de leesbaarheid

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

Een afgeleide zoekopdracht gebruiken:

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

Documentatie

  • Postgres
  • Roodverschuiving
  • Oracle
  • SQLServer

  1. Hoe current_date werkt in PostgreSQL

  2. Hoe u de maand van een datum haalt in T-SQL

  3. Een .SQL-scriptbestand uitvoeren met c#

  4. Belangrijkste technologische veranderingen in E-Business Suite 12.2