Select: valori duplicati ...

venerdì 18 maggio 2007 - 08.11

simonegiusti Profilo | Newbie

tabella SPETTACOLI (campi IDspettacoli, titolo)

tabella CREDITS (campi qualifica, IDspettacoli)

SELECT DISTINCT SPETTACOLI.titolo, credits.qualifica FROM SPETTACOLI INNER JOIN credits ON SPETTACOLI.IDspettacoli = credits.IDspettacoli

così facendo ottengo tutti i record duplicati per ogni occorrenza in credits

Come faccio ad ottenere un solo TITOLO indipendentemente dal numero dei record presenti nella tabella CREDITS collegata ???

grazie.

lbenaglia Profilo | Guru

>Come faccio ad ottenere un solo TITOLO indipendentemente dal
>numero dei record presenti nella tabella CREDITS collegata ???

Ciao Simone,

Dato che ad 1 spettacolo corrispondono n credits, per ottenere quello che chiedi occorre rispondere alla seguente domanda:
considerando tutte le qualifiche associate ad un titolo, quale vuoi restituire?

Osserva il seguente esempio:

USE tempdb; CREATE TABLE dbo.Spettacoli( SpettacoloID int NOT NULL PRIMARY KEY, Titolo varchar(15) NOT NULL ); CREATE TABLE dbo.Credits( CreditID int NOT NULL PRIMARY KEY, SpettacoloID int NOT NULL, Qualifica varchar(15) NOT NULL, CONSTRAINT FK_Credits_Spettacoli FOREIGN KEY(SpettacoloID) REFERENCES dbo.Spettacoli(SpettacoloID) ); INSERT dbo.Spettacoli VALUES(1, 'Spettacolo 1'); INSERT dbo.Spettacoli VALUES(2, 'Spettacolo 2'); INSERT dbo.Spettacoli VALUES(3, 'Spettacolo 3'); INSERT dbo.Credits VALUES(1, 1, 'Qualifica 1'); INSERT dbo.Credits VALUES(2, 1, 'Qualifica 2'); INSERT dbo.Credits VALUES(3, 1, 'Qualifica 3'); INSERT dbo.Credits VALUES(4, 2, 'Qualifica 4'); INSERT dbo.Credits VALUES(5, 2, 'Qualifica 5'); /* Tua query */ SELECT DISTINCT S.Titolo, C.Qualifica FROM dbo.Spettacoli AS S INNER JOIN dbo.Credits AS C ON S.SpettacoloID = C.SpettacoloID; /* Output: Titolo Qualifica --------------- --------------- Spettacolo 1 Qualifica 1 Spettacolo 1 Qualifica 2 Spettacolo 1 Qualifica 3 Spettacolo 2 Qualifica 4 Spettacolo 2 Qualifica 5 (5 row(s) affected) */ /* Mia query */ SELECT S.Titolo, MAX(C.Qualifica) AS Qualifica FROM dbo.Spettacoli AS S INNER JOIN dbo.Credits AS C ON S.SpettacoloID = C.SpettacoloID GROUP BY S.Titolo; /* Output: Titolo Qualifica --------------- --------------- Spettacolo 1 Qualifica 3 Spettacolo 2 Qualifica 5 (2 row(s) affected) */ DROP TABLE dbo.Credits, dbo.Spettacoli;

Come vedi nella seconda query ho utilizzato la funzione di aggregazione MAX() che restituisce la "massima qualifica" relativa ad un certo titolo.
Se il tuo intento era differente ti invito a indicarci chiaramente il result set che vorresti ottenere partendo dall'esempio proposto.

>grazie.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

simonegiusti Profilo | Newbie

La tua spiegazione è perfetta e calza a pennello ...
una sola domanda ... se il campo qualifica non fosse numerico ma stringa cosa posso utilizzare al posto di MAX ??

lbenaglia Profilo | Guru

>una sola domanda ... se il campo qualifica non fosse numerico
>ma stringa cosa posso utilizzare al posto di MAX ??

Ehm... nel mio esempio Qualifica è una stringa
La funzione di aggregazione MAX() applicata ad una espressione alfanumerica restituisce il valore più elevato in base alla collation che stai utilizzando.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Pongo Profilo | Senior Member

Scusate se mi intrometto.. Lorenzo, come fai ad usare SQL da prompt dei comandi?

Mi ricordo che la usavo con Oracle ma con SQLServer non ho trovato qualcosa del genere!! Forse perchè non c'è?? ¬_¬"

Ciaooooo!

lbenaglia Profilo | Guru

>Scusate se mi intrometto.. Lorenzo, come fai ad usare SQL da
>prompt dei comandi?
>
>Mi ricordo che la usavo con Oracle ma con SQLServer non ho trovato
>qualcosa del genere!! Forse perchè non c'è?? ¬_¬"

C'è, c'è e anzi, ci sono diversi tools via riga di comando!

Fino a SQL Server 2000 puoi utilizzare:

- isql.exe
- osql.exe

Il primo si basa sulle DB-Library (interfaccia storica di SQL Server) mentre il secondo su ODBC (consigliato).
Con SQL Server 2005 puoi ricorrere a:

- osql.exe
- sqlcmd.exe

In questo caso ti consiglio di usare sqlcmd.exe (basato su OLE DB) che permette di accedere a tutte le nuove funzionalità presenti in questa versione.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5