sql >> Databasteknik >  >> RDS >> PostgreSQL

Rekursiv SELECT-fråga för att returnera frekvenser av godtyckligt djup?

Detta kan vara vad du letar efter, enligt din beskrivning:

WITH RECURSIVE cte AS (
   SELECT id, parent_rate_plan_id
   FROM   rate_plan  
   WHERE  id = ${user rate plan ID} 

   UNION ALL
   SELECT rp.id, rp.parent_rate_plan_id
   FROM   cte
   JOIN   rate_plan rp ON rp.id = cte.parent_rate_plan_id
   )
SELECT *
FROM   cte
JOIN   rate r ON r.rate_plan_id = cte.id
ODER   BY length(prefix) DESC
LIMIT  1;

Rekursionen stoppas automatiskt så snart toppnoden (parent_rate_plan_id IS NULL ) nås.

Det är mer effektivt att gå med för att rate en gång efter att du har samlat in alla planer.

Handboken om (rekursiva) CTE.




  1. LINQ till SQL Take w/o Skip Orsakar flera SQL-satser

  2. MySQL:Använder DATETIME som primärnyckel

  3. Ofta fel i Oracle ORA-04068:befintligt tillstånd för paket har kasserats

  4. En expertguide till Slony-replikering för PostgreSQL