[Basi di dati] SQL

Fab996
ImpProg
A101
102A
B103


Data questa relazione perchè se eseguo questo codice
select P1.Prog
from Partecip P1 join Partecip P2 on P1.Prog = P2.Prog
where p1.Imp<>p2.Imp
ottengo $A,B,A,B$ ?

Nella query faccio il join della relazione con se stessa quindi ottengo una relazione formata dai campi p1,imp p1.prog p2.imp p2.prog, poi vado a fare una where sui campi p1.imp p2.imp però non capisco cosa accade

Risposte
apatriarca
Ho guardato la query velocemente ma credo che il problema sia che ottieni ogni coppia due volte. Per ottenere ogni coppia una sola volta devi impostare un ordinamento. Per esempio richiedendo che P1.Imp sia minore di P2.Imp.

Fab996
"apatriarca":
Ho guardato la query velocemente ma credo che il problema sia che ottieni ogni coppia due volte. Per ottenere ogni coppia una sola volta devi impostare un ordinamento. Per esempio richiedendo che P1.Imp sia minore di P2.Imp.

Grazie della risposta, forse non mi sono spiegato bene la query è giusta perchè è una parte della soluzione solo non capisco bene cosa faccia. Dopo la from ottengo una tabella di questo genere ?
Imp1Prog1Imp2Prog2
A101A101
101B102A
A103B103


Dato che ho fatto il join, poi però con l'operazione where cosa succede?

apatriarca
Stai in pratica prendendo ogni coppia possibile ottenibile da elementi della stessa tabella che abbiano Prog in comune. Il risultato prima del where sarà quindi il seguente.

P1.ImpP1.ProgP2.ImpP2.Prog
A101A101
102A102A
A102A102
101B101B
B103B103
101B103B
B103D103


A questo punto rimuovi con il where ogni coppia che abbia due Imp uguale. Il risultato finale è quindi:

P1.ImpP1.ProgP2.ImpP2.Prog
A102A102
101A101B
B103B101

Fab996
Grazie mille, sbagliavo a fare il join. Non è che potresti aiutarmi con un altro esercizio :)?

apatriarca
Chiedi pure..

Fab996
In questo esercizio devo trovare le cardinalità minime e massime. Per il primo esercizio so che le soluzioni sono Min 200 e Max 20000. Il primo join la cardinalità deve essere per forza 200 in quanto è tra il vincolo referenziale e una chiave, solo il secondo join come ho disegnato a destra ha il massimo di 20000 perchè appunto su E si potrebbero avere tutte A e anche su G(quindi faccio il prodotto cartesiano) e comunque la chiave è rispettata perchè magari H ha tutti valori diversi. Quindi sul massimo sono sicuro di 2000, mentre il minimo potrebbe essere 0 perchè magari tra E e G non ci sono valori in comune perchè sono contenuti tutti in H. Quindi il minimo è 0, solo il risultato giusto è 200. Quindi se mi potresti spiegare il ragionamento, almeno poi provo anche il secondo... Grazie mille

apatriarca
Dipende dalla particolare definizione di join utilizzata. L'impressione è che nella soluzione si dia per scontato che ad ogni riga della prima tabella corrisponda almeno una riga nella soluzione (eventualmente riempita con elementi nulli). Sarebbe quello che in SQL è chiamato LEFT OUTER JOIN. Tuttavia il simbolo usato sembra quello dell'equijoin che normalmente ha una definizione diversa per cui è possibile che non ci siano righe nel risultato.

Fab996
Si la definizione utilizzata è quella di equi join e appunto nel primo esercizio non capisco perchè il minimo sia 200 e il massimo 20000.

apatriarca
Scusa, avevo letto di fretta. Ad ogni riga di riga di R1 corrisponde esattamente una riga di R2 quando fai la join su questo vincolo. Ad ogni riga di R2 corrisponde una sola riga in R3 quando fai la join su entrambe gli elementi, ma almeno una fino a tutta la tabella se ne consideri solo una per la join.

Fab996
Grazie, mentre il secondo esercizio l'intersezione come devo svolgerla?

apatriarca
Questa volta la join è sulla chiave intera di R3 per cui hai una riga di R3 per ogni riga di R2.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.