PDA

View Full Version : [SQL] una domandina sul group by


australopiteci
15-02-2006, 15:38
ragazzi ho questa query:


Visualizzare, per ciascuna delle relazioni presentate che hanno almeno un autore di
nazionalità italiana, il titolo e il numero degli autori di nazionalità italiana che hanno
partecipato alla sua stesura


e questa è la soluzione:


SELECT relazione.titolo, COUNT(*)
FROM presentazione JOIN stesura ON (presentazione.relazione =
stesura.relazione)
JOIN relazione ON (presentazione.relazione = relazione.codice)
JOIN autore ON (stesura.autore = autore.nome)
WHERE autore.nazione = 'italia'
GROUP BY relazione.codice, relazione.titolo



Io mi chiedevo questa domanda:

Visualizzare, per ciascuna delle relazioni presentate che hanno almeno un autore di
nazionalità italiana, il titolo e il numero degli autori di nazionalità francese che hanno
partecipato alla sua stesura


E' possibile scrivere una query x rispondere a questa domanda in modo simile a quello precedente??




edit:
queste sono le tabelle:

create table autore(
nome varchar(20) primary key not null,
istituzione varchar(20) not null,
nazione varchar(20) not null
)
without oids;

create table relazione(
codice int primary key not null,
titolo varchar(20) not null
)without oids;

create table stesura(
autore varchar(20) not null
references autore(nome)
on delete cascade
on update restrict,
relazione int not null
references relazione(codice)
on delete cascade
on update restrict,
primary key(autore, relazione)
)without oids;

create table coordinatore(
nome varchar(20) primary key not null,
sessione varchar(20) unique not null
)without oids;

create table presentazione(
relazione int primary key not null
references relazione(codice)
on delete cascade
on update restrict,
autore varchar(20) not null
references autore(nome)
on delete cascade
on update restrict,
sessione varchar(20) not null
references coordinatore(sessione)
on delete cascade
on update restrict
)without oids;

australopiteci
15-02-2006, 18:14
up :)

Mixmar
15-02-2006, 21:13
Io proverei a risolvere così, anche se, lo ammetto, non è efficientissima:


SELECT relazione.titolo, COUNT(*)
FROM stesura JOIN relazione ON (stesura.relazione = relazione.codice)
JOIN autore ON (stesura.autore = autore.nome)
WHERE autore.nazione = 'francia' AND relazione.codice IN
(SELECT relazione.codice
FROM presentazione JOIN stesura ON (presentazione.relazione =
stesura.relazione)
JOIN relazione ON (presentazione.relazione = relazione.codice)
JOIN autore ON (stesura.autore = autore.nome)
WHERE autore.nazione = 'italia')
GROUP BY relazione.codice, relazione.titolo


Se qualcuno ha idee migliori... :D

australopiteci
15-02-2006, 21:46
k grazie mille :)

ora vedo se riesco a fare di meglio ;)

Emyl
16-02-2006, 19:38
Per avere la stessa query con gli autori francesi basta cambiare la nazione in 'francia' immagino.

Alternativamente, con questa query:


SELECT autore.nazione, relazione.titolo, COUNT(*)
FROM presentazione JOIN stesura ON (presentazione.relazione =
stesura.relazione)
JOIN relazione ON (presentazione.relazione = relazione.codice)
JOIN autore ON (stesura.autore = autore.nome)
GROUP BY autore.nazione, relazione.codice, relazione.titolo


Aggiungi la nazionalita' alla GROUP BY e ti becchi tutti i record divisi anche per nazione.

Ciao ;)

Mixmar
16-02-2006, 21:01
Per avere la stessa query con gli autori francesi basta cambiare la nazione in 'francia' immagino.


No, credo che così non funzionerebbe, perchè in tal caso avresti la soluzione a questa domanda:

Visualizzare, per ciascuna delle relazioni presentate che hanno almeno un autore di nazionalità francese, il titolo e il numero degli autori di nazionalità francese che hanno partecipato alla sua stesura

Emyl
16-02-2006, 21:12
mmh... mi era scappata una condizione :)

Si, la tua soluzione mi sa che e' la migliore. Rileggendo meglio avevo ipotizzato si potesse fare in maniera piu' efficiente con una subquery dentro la FROM, boh forse e' fattibile ma ora come ora non mi e' venuto in mente nulla.

Forse spremendosi un po'.... :D

Mixmar
17-02-2006, 15:00
Rileggendo meglio avevo ipotizzato si potesse fare in maniera piu' efficiente con una subquery dentro la FROM, boh forse e' fattibile ma ora come ora non mi e' venuto in mente nulla.

Forse spremendosi un po'.... :D

Ti dirò, ho la stessa impressione anch'io... ma nessuna idea per ora. :confused: