[Basi di dati] SQL
Imp | Prog |
---|---|
A | 101 |
102 | A |
B | 103 |
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.Impottengo $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
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.
"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 ?
Imp1 | Prog1 | Imp2 | Prog2 |
---|---|---|---|
A | 101 | A | 101 |
101 | B | 102 | A |
A | 103 | B | 103 |
Dato che ho fatto il join, poi però con l'operazione where cosa succede?
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.
A questo punto rimuovi con il where ogni coppia che abbia due Imp uguale. Il risultato finale è quindi:
P1.Imp | P1.Prog | P2.Imp | P2.Prog |
---|---|---|---|
A | 101 | A | 101 |
102 | A | 102 | A |
A | 102 | A | 102 |
101 | B | 101 | B |
B | 103 | B | 103 |
101 | B | 103 | B |
B | 103 | D | 103 |
A questo punto rimuovi con il where ogni coppia che abbia due Imp uguale. Il risultato finale è quindi:
P1.Imp | P1.Prog | P2.Imp | P2.Prog |
---|---|---|---|
A | 102 | A | 102 |
101 | A | 101 | B |
B | 103 | B | 101 |
Grazie mille, sbagliavo a fare il join. Non è che potresti aiutarmi con un altro esercizio
?

Chiedi pure..
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
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.
Si la definizione utilizzata è quella di equi join e appunto nel primo esercizio non capisco perchè il minimo sia 200 e il massimo 20000.
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.
Grazie, mentre il secondo esercizio l'intersezione come devo svolgerla?
Questa volta la join è sulla chiave intera di R3 per cui hai una riga di R3 per ogni riga di R2.