sql >> Database >  >> RDS >> PostgreSQL

Meerdere CTE in één zoekopdracht

Gebruik het sleutelwoord WITH eenmaal op de top. Als een van uw Common Table Expressions (CTE) recursief (rCTE) is, moet u het trefwoord RECURSIVE toevoegen bovenaan eenmaal ook, zelfs als niet alle CTE's recursief zijn:

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

De handleiding:

Als RECURSIVE is opgegeven, toestaat een SELECT subquery om zichzelf op naam te verwijzen.

Vetgedrukte nadruk van mij. En, nog meer inzichtelijk:

Een ander effect van RECURSIVE is dat WITH zoekopdrachten hoeven niet te worden besteld :een query kan verwijzen naar een andere die later in de lijst staat. (Cirkelverwijzingen of wederzijdse recursie zijn echter niet geïmplementeerd.) Zonder RECURSIVE , WITH zoekopdrachten kunnen alleen verwijzen naar broer of zus WITH zoekopdrachten die eerder in de WITH . staan lijst.

Vetgedrukte nadruk nogmaals van mij. Dit betekent dat de volgorde van WITH clausules is zinloos wanneer de RECURSIVE sleutelwoord is gebruikt.

Trouwens, sinds cte1 en cte2 in het voorbeeld wordt niet verwezen in de buitenste SELECT en zijn gewoon SELECT commando's zelf (geen neveneffecten), ze worden nooit uitgevoerd (tenzij ernaar wordt verwezen in cte3 ).



  1. Minimale logging met INSERT...SELECT en Fast Load Context

  2. Wat is SQL-injectie?

  3. Leer documenten op het Windows-bestandssysteem op te slaan en te analyseren met SQL Server Semantic Search - Deel 1

  4. Wat is een één-op-veel-relatie in een database? Een uitleg met voorbeelden