Principale limitazione di AR e SQL-92: interrogazioni ricorsive
IMPIEGATO
NOME
NOMECAPO
Rossi
Verdi
Neri
Verdi
Verdi
DeSio
Tucci
DeSio
DeLuca
DeSio
DeSio
Lazio
Lazio
Query
selezionare tutti i capi
di “Rossi”
NOMECAPO
Verdi
DeSio
Lazio
Questa interrogazione è riconducibile ad un caso
di chiusura transitiva di una relazione binaria
In SQL-3 (SQL-1999) si possono esprimere interrogazioni ricorsive
In DB2
WITH CAPO (NOME, NOMECAPO) AS
(
SELECT NOME, NOMECAPO
FROM IMPIEGATO
UNION
SELECT CAPO.NOME, IMPIEGATO.NOMECAPO
FROM CAPO, IMPIEGATO
WHERE CAPO.NOMECAPO = IMPIEGATO.NOME
SELECT NOMECAPO
FROM CAPO WHERE NOME = 'Rossi'
AND NOMECAPO IS NOT NULL;
)
Access non accetta
interrogazioni
ricorsive
Interrogazioni Ricorsive in SQL

In SQL2 non è possibile definire interrogazioni che facciano uso della
ricorsione
Esempio
– Impiegato(Nome,NomeCapo)
– non è possibile esprimere l’interrogazione che ritrova “tutti i capi di un
impiegato”, con un numero arbitrario di livelli intermedi
per risolvere queste interrogazioni con SQL2, è necessario utilizzare SQL da
programma (o stored procedure)
in SQL-99 c’è la possibilità di esprimere interrogazioni ricorsive

base teorica: basi di dati deduttive



–
Capo(Nome,NomeCapo)  Capo(Nome,NomeCapo)
Capo(Nome,NomeCapo) Impiegato(Nome,impiegato1),
Capo(impiegato1,NomeCapo)
–
Capo è una vista ricorsiva: nella sua definizione usa se stessa
–
SQL-99 - comando WITH

il comando WITH consente di definire delle tabelle temporanee che non
diventano parte dello schema ma rappresentano solo dichiarazioni di relazioni
da utilizzare nel contesto dell’interrogazione associata a WITH
WITH
R1 AS <definizione di R1>,
...
Rn AS <definizione di Rn>,
<interrogazione che coinvolge R1, …, Rn>





ogni definizione può essere ricorsiva e mutuamente ricorsiva
ogni relazione coinvolta in una ricorsione deve essere preceduta dalla parola
chiave RECURSIVE
la definizione per la relazione Ri consiste in
– parola chiave opzionale RECURSIVE
– il nome della relazione che si sta definendo (seguita da AS)
– interrogazione che definisce Ri e può fare riferimento a R1 ,…, Ri-1
l’interrogazione finale che può far riferimento a tutte le relazioni definire
in precedenza
la ricorsione deve essere lineare
–
nella definizione di una relazione R, R può comparire una sola volta
Esempi

Esempio di ricorsione lineare (nota RECURSIVE rispetto a DB2)
WITH RECURSIVE CAPO (NOME, NOMECAPO) AS
(
SELECT NOME, NOMECAPO
FROM IMPIEGATO
UNION
SELECT CAPO.NOME, IMPIEGATO.NOMECAPO
FROM CAPO, IMPIEGATO
WHERE CAPO.NOMECAPO = IMPIEGATO.NOME )
SELECT * FROM CAPO;

Esempio di ricorsione non lineare : non accettata dallo standard
WITH RECURSIVE CAPO (NOME, NOMECAPO) AS
(
SELECT NOME, NOMECAPO
FROM IMPIEGATO
UNION
SELECT R1.NOME, R2.NOMECAPO
FROM CAPO R1, CAPO R2 R1.NOMECAPO = R2.NOME )
SELECT * FROM CAPO;

La forma della query deriva dalla semantica, ovvero dal modo con la quale
CAPO viene calcolata
SQL-99 - semantica della ricorsione


La semantica delle interrogazioni ricorsive è definita mediante la
nozione di punto fisso (più precisamente minimo punto fisso)
Se R è Binaria (es. R(A,B)) si parla anche di chiusura transitiva R+ :
è la più piccola (rispetto alla inclusione) relazione tale che
1.
2.

si costruisce una sequenza Ri di relazioni tali che:
–
–
–

Contiene R+
Se (x,y) e (y,z) sono in R+ allora anche (x,z) è in R+
R0 è la relazione vuota
Ri, 1  i, viene ottenuta applicando la definizione della relazione a Ri-1
quando, per un certo i, si ha che Ri = Ri-1 ci si ferma e tale relazione è il
minimo punto fisso e costituisce il risultato dell'interrogazione ricorsiva
Esempio: CAPO è la chiusura transitiva di IMPIEGATO
SQL-99 - semantica della ricorsione


La semantica delle interrogazioni ricorsive è definita mediante la
nozione di punto fisso (più precisamente minimo punto fisso)
si costruisce una sequenza Ri di relazioni tali che:
–
–
–

Se R è Binaria si parla anche di chiusura transitiva R+ : è la più
piccola (rispetto alla inclusione) relazione tale che
1.
2.

R0 è la relazione vuota
Ri, 1  i, viene ottenuta applicando la definizione della relazione a Ri-1
quando, per un certo i, si ha che Ri = Ri-1 ci si ferma e tale relazione è il
minimo punto fisso e costituisce il risultato dell'interrogazione ricorsiva
Contiene R+
Se (x,y) e (y,z) sono in R+ allora anche (x,z) è R+
Esempio: CAPO è la chiusura transitiva di IMPIEGATO
Esempio
Determinare i cammini di un grafo dati gli archi
WITH
RECURSIVE Cammino(da,a) AS
(SELECT da,a FROM Arco)
UNION
(SELECT R1.da, R2.a
FROM Arco AS R1, Cammino AS R2
WHERE R1.a = R2.da);
SELECT * FROM Cammino;

Esempio (continua)



Arco
Cammino0 = ;
Cammino1 =
Esempio - semantica

Cammino2 = Cammino1 

Cammino3 = Cammino2 

Cammino4 = Cammino3 punto fisso e risultato
Scarica

interrogazioni ricorsive