sql >> Databasteknik >  >> RDS >> PostgreSQL

Flera CTE i en enda fråga

Använd nyckelordet WITH en gång på toppen. Om något av dina vanliga tabelluttryck (CTE) är rekursiva (rCTE) måste du lägga till nyckelordet RECURSIVE överst en gång även om inte alla CTE är rekursiva:

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

Manualen:

Om RECURSIVE är specificerad, tillåter en SELECT delfråga för att referera till sig själv efter namn.

Djärv betoning min. Och ännu mer insiktsfull:

En annan effekt av RECURSIVE är det WITH frågor behöver inte beställas :en fråga kan referera till en annan som finns längre fram i listan. (Men cirkulära referenser eller ömsesidig rekursion implementeras inte.)Utan RECURSIVE , WITH frågor kan bara referera till syskon WITH frågor som finns tidigare i WITH lista.

Djärv betoning min igen. Det betyder att ordningen WITH satser är meningslösa när RECURSIVE nyckelord har använts.

BTW, eftersom cte1 och cte2 i exemplet refereras inte i den yttre SELECT och är vanliga SELECT kommandona själva (inga bieffekter), de exekveras aldrig (såvida de inte hänvisas till i cte3 ).



  1. DATEDIFF() Exempel – MySQL

  2. QPSQL-drivrutinen har inte laddats Qt

  3. Hur man upptäcker och förhindrar oväntad tillväxt av SQL Server-databasen TempDB

  4. ORA-12519 TNS:ingen lämplig servicehanterare hittades