PDA

View Full Version : [SQL] Chiarimento su due query


Jwalker
06-07-2009, 18:49
Salve. Ho un db così fatto

AUTO(TARGA,MARCA,MODELLO)
CLIENTE (CF,NOME,CITTA)
ACQUISTO (TARGA,CF,DATA,PREZZO,KM)
FK: TARGA REFERENCES AUTO
CF REFERENCES CLIENTE

e queste due query

Selezionare i CLIENTI che hanno acquistato tutte le auto (precedentemente o successivamente)
acquistate dal CLIENTE con cf ‘ABC’;

SELECT *
FROM CLIENTE CL
WHERE NOT EXISTS ( SELECT *
FROM ACQUISTO T1
WHERE T1.CF = ’ABC’
AND NOT EXISTS (SELECT *
FROM ACQUISTO T2
WHERE CL.CF = T2.CF
AND T1.TARGA = T2.TARGA))


Selezionare per ogni cf i prezzi delle due AUTO acquistate con minor numero di km.

SELECT T.CF, T.PREZZO
FROM ACQUISTO T
WHERE 2 >= ( SELECT COUNT(*)
FROM ACQUISTO T1
WHERE T.CF = T1.CF
AND T1.KM <= T.KM)

ma non riesco proprio a capirle.... :muro: :muro: C'è nessuno così gentile da aiutarmi?? :p

Ciao e grazie :)

RaouL_BennetH
06-07-2009, 23:16
Ciao :)

Non ho ben capito se queste query le devi analizzare perchè già esistenti oppure sono quelle che hai provato a fare tu per ottenere i risultati richiesti.


Le mie perplessità sono queste:

Per la prima query, personalmente avrei utilizzato una forma di confronto del tipo 'diverso_da' piuttosto che 'dove_non_esiste'. Se ho compreso bene la prima query, significa semplicemente:

Seleziona tutti i clienti dove 'ABC' non esiste o meglio, seleziona tutti i clienti che non corrispondono ad 'ABC'. Non capisco però cosa voglia significare un confronto anche sulla targa (forse è un parametro che passi alla query? ) ma, soprattutto, non capisco come si possa fare un confronto tra eventi successi PRIMA o DOPO un evento se non si considera anche un intervallo di date, per es.:



....blabla WHERE ACQUISTO.DATA BETWEEN unaData and unaAltraData




La seconda poi mi fa sorgere spontanea la domanda:

perchè non utilizzare semplicemente un MIN(ACQUISTO.KM) ?

Jwalker
07-07-2009, 15:03
quelle query sono soluzioni del prof, sono state date così, per buone,ed effettivamente anche se sembrano assurde funzionano... quello che volevo io è capirle.... cioè perchè sono state fatte così???
ad esempio, nella seconda che significa ".... 2 >= ( SELECT COUNT(*) .... "

:cry:

gugoXX
08-07-2009, 11:21
Bisogna cambiare un po' le frasi di richiesta in italiano per farle collimare con SQL

1. Enunciare ogni cliente tale per cui non esista nemmeno un'auto acquistata da ABC che non sia stata acquistata anche da tale cliente

2. Enunciare ciascun acquisto T di ogni cliente, tali per cui il numero di acquisti di tale cliente aventi kilometri inferiori a T sia minore o uguale a 2

Invece che
WHERE 2>= (SELECT COUNT(*) ....)
vedila come
WHERE (SELECT COUNT(*) ...) <=2
che e' piu' umanamente leggibile.


Per inciso, l'abilita' di trasformare le frasi in italiano in altre frasi in italiano pero' direttamente componibili in SQL e' una delle abilita' richieste per i modellatori e manutentori di Database.