En av föreläsningarna på FSCONS som jag hann besöka var Magnus Haganders uppdatering av vad som är nytt och snabbare (det var mycket performance imporvements) i PostgreSQL. En feature som jag saknat är stöd för rekursiva frågor. Det har funnits i SQL-standarden sedan 2003 men inte funnits i PostgreSQL förrän nu.

Ett exempel är typtabellen anställda (emp), som i detta fall innehåller:

id | department  | name | manager
---+-------------+------+---------
1  | Management  | Bill |
2  | Management  | Carl |
3  | Finance     | Lisa | 1
4  | Development | Lars | 2
5  | Development | Mats | 2
6  | Development | Ola  | 5

och med följande fråga

WITH RECURSIVE t(id, department, name, manager) AS (
  SELECT id, department, name, manager
  FROM emp WHERE name='Carl'
 UNION ALL
  SELECT emp.id, emp.department, emp.name, emp.manager
  FROM emp JOIN t ON t.manager=emp.id
)
SELECT * FROM t ORDER BY manager NULLS FIRST, id;

så blir resultatet

id | department  | name | manager
---+-------------+------+---------
2  | Management  | Carl |
4  | Development | Lars | 2
5  | Development | Mats | 2
6  | Development | Ola  | 5

Det röda pekar ut roten av trädet (raden man utgår från), följt av UNION och därefter urvalet i blått för resten av raderna (behöver matcha det röda) och därefter det rekursiva förhållandet i grönt.

Så, äntligen slipper man bygga in detta i funktioner och kan förlita sig på SQL endast!

En annan trevlig feature som jag inte sett i PostgreSQL tidigare är partiella aggregat (heter det så på svenska?) där man kan låta sum, avg, rank osv alltså jobba på delar av de resulterande raderna.