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

Flere CTE i enkelt forespørgsel

Brug nøgleordet WITH en gang på toppen. Hvis nogle af dine almindelige tabeludtryk (CTE) er rekursive (rCTE), skal du tilføje søgeordet RECURSIVE øverst en gang også, selvom ikke alle CTE'er er rekursive:

WITH RECURSIVE
  cte1 AS (...)         -- can still be non-recursive
, cte2 AS (SELECT ...
           UNION ALL
           SELECT ...)  -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...

Manualen:

Hvis RECURSIVE er angivet, tillader det en SELECT underforespørgsel for at henvise til sig selv ved navn.

Fed understregning min. Og endnu mere indsigtsfuldt:

En anden effekt af RECURSIVE er det WITH forespørgsler behøver ikke bestilles :en forespørgsel kan referere til en anden, der er senere på listen. (Cirkulære referencer eller gensidig rekursion er dog ikke implementeret.)Uden RECURSIVE , WITH forespørgsler kan kun henvise til søskende WITH forespørgsler, der er tidligere i WITH liste.

Fed betoning min igen. Det betyder, at rækkefølgen WITH klausuler er meningsløse når RECURSIVE nøgleord er blevet brugt.

BTW, da cte1 og cte2 i eksemplet er der ikke refereret i den ydre SELECT og er almindelige SELECT kommandoerne selv (ingen sideeffekter), de udføres aldrig (medmindre der henvises til cte3 ).



  1. Brug TYPEPROPERTY() til at returnere oplysninger om en datatype i SQL Server

  2. Implementering af Switchover/Switchback i PostgreSQL 9.3.

  3. Få tællinger af alle tabeller i et skema

  4. Databasedesign til revisionslogning