sql >> Databasteknik >  >> RDS >> Database

Vanliga tabelluttryck:När och hur man använder dem

Vad är vanliga tabelluttryck (CTE)?

Ett Common Table Expression (CTE) är resultatet av en fråga som existerar tillfälligt och endast för användning inom ramen för en större fråga. Ungefär som en härledd tabell lagras inte resultatet av en CTE och existerar bara under hela frågan. Den här artikeln kommer att fokusera på icke-rekursiva CTE:er.

Hur är CTE:er användbara?

CTE:er, som databasvyer och härledda tabeller, gör det möjligt för användare att lättare skriva och underhålla komplexa frågor via ökad läsbarhet och förenkling. Denna minskning av komplexitet uppnås genom att dekonstruera vanliga komplexa frågor till enkla block som ska användas, och återanvändas vid behov, vid omskrivning av frågan. Exempel på användningsfall inkluderar:

  • Behöver referera till en härledd tabell flera gånger i en enda fråga
  • Ett alternativ till att skapa en vy i databasen
  • Utför samma beräkning flera gånger över flera frågekomponenter

Hur man skapar en CTE

  • Initiera en CTE med "WITH"
  • Ange ett namn för sökfrågan som snart kommer att definieras
  • När du har tilldelat ett namn, följ med "AS"
  • Ange kolumnnamn (valfritt steg)
  • Definiera frågan för att skapa önskad resultatuppsättning
  • Om flera CTE krävs, initiera varje efterföljande uttryck med kommatecken och upprepa steg 2-4.
  • Referera till ovan definierade CTE(s) i en efterföljande fråga

Syntax

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

##Exempel CTE Följande fråga besvarar affärsfrågan:"vad är den genomsnittliga månadskostnaden per kampanj för företagets marknadsföringsinsatser?" Detta kan åstadkommas med en härledd fråga (visas nedan); Men att använda en CTE förbättrar läsbarheten

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

Använda en härledd fråga:

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ödförskjutning
  • Oracle
  • SQLServer

  1. Komplex främmande nyckel-begränsning i SQLAlchemy

  2. Kan jag sätta ignore_dup_key på för en primärnyckel?

  3. Relationsmodellen

  4. SQL GROUP BY- 3 enkla tips för att gruppera resultat som ett proffs