Problemi con una query

mercoledì 19 novembre 2008 - 16.36

luxsor Profilo | Guru

Ho il seguente problema:

nella tabella 1 abbiamo i seguenti campi ( idcliente, nome, cognome, citta , idtelefono)
nella tabella 2 abbiamo i seguenti campi (idtelefono, numero)

Ho bisogno di inserire nella tabella 2 tutti i numeri telefonici riferiti ad un singolo cliente, quindi creo una query per l'inserimento del cliente con un idtelefono, per la query di inserimento dei numeri telefonici utilizzo quel idtelefono come identificatore e aggiungi i vari numeri:
es. idtelefono numero
4 3331457789
4 3354417784

e così via.
Come faccio a recuperare tutti i numeri di telefono con i dati del cliente tramite una query.




alx_81 Profilo | Guru

>Ho il seguente problema:
>
>nella tabella 1 abbiamo i seguenti campi ( idcliente, nome, cognome,
>citta , idtelefono)
>nella tabella 2 abbiamo i seguenti campi (idtelefono, numero)
>
>Ho bisogno di inserire nella tabella 2 tutti i numeri telefonici
>riferiti ad un singolo cliente, quindi creo una query per l'inserimento
>del cliente con un idtelefono, per la query di inserimento dei
>numeri telefonici utilizzo quel idtelefono come identificatore
>e aggiungi i vari numeri:
>es. idtelefono numero
> 4 3331457789
> 4 3354417784
>
>e così via.
>Come faccio a recuperare tutti i numeri di telefono con i dati
>del cliente tramite una query.
Con una semplice JOIN (OUTER se ti serve far vedere comunque anche i clienti che non hanno i numeri di telefono).
Eccoti un semplice esempio:


USE tempdb; GO CREATE TABLE dbo.NumeriTelefono ( IDTelefono int IDENTITY(1,1) NOT NULL , IDCliente int NOT NULL , Numero varchar(20) NOT NULL , CONSTRAINT PK_dboNumeriTelefono PRIMARY KEY CLUSTERED ( IDTelefono ) ) GO CREATE TABLE dbo.Clienti ( IDCliente int IDENTITY(1,1) NOT NULL , Nome varchar(30) NOT NULL , Cognome varchar(30) NOT NULL , CONSTRAINT PK_dboClienti PRIMARY KEY CLUSTERED ( IDCliente ) ) GO -- popolo con valori di esempio INSERT INTO dbo.Clienti (Nome, Cognome) VALUES ('Alessandro', 'Alpi') INSERT INTO dbo.Clienti (Nome, Cognome) VALUES ('Vincenzo', 'Violante') INSERT INTO dbo.Clienti (Nome, Cognome) VALUES ('Michael', 'Denny') INSERT INTO dbo.Clienti (Nome, Cognome) VALUES ('Marco', 'Rossi') GO INSERT INTO dbo.NumeriTelefono (IDCliente, Numero) VALUES (1, '0525123456789') INSERT INTO dbo.NumeriTelefono (IDCliente, Numero) VALUES (1, '0525123456788') INSERT INTO dbo.NumeriTelefono (IDCliente, Numero) VALUES (2, '0525123456787') INSERT INTO dbo.NumeriTelefono (IDCliente, Numero) VALUES (3, '0525123456786') INSERT INTO dbo.NumeriTelefono (IDCliente, Numero) VALUES (3, '0525123456785') GO SELECT C.Nome , C.Cognome , COALESCE(N.Numero, 'Non disponibile') FROM dbo.Clienti C LEFT JOIN dbo.NumeriTelefono N ON C.IDCliente = N.IDCliente DROP TABLE dbo.Clienti DROP TABLE dbo.NumeriTelefono GO

Come vedi, ho cambiato il modello delle tue tabelle, andando a fare una relazione 1:N..

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

luxsor Profilo | Guru

Perfetto funziona, ma è possibile avere come risultato questo:

nome | cognome | telefono1 | telefono 2 | telefono3 ecc..


alx_81 Profilo | Guru

>Perfetto funziona, ma è possibile avere come risultato questo:
>
>nome | cognome | telefono1 | telefono 2 | telefono3 ecc..
Siccome è decisamente scomodo ottenere un risultato del genere, ti consiglio di concatenare lato applicativo, scorrendo il resultset ottenuto..
Che tipo di applicazione stai scrivendo?

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

jenga Profilo | Newbie

>Siccome è decisamente scomodo ottenere un risultato del genere,
>ti consiglio di concatenare lato applicativo, scorrendo il resultset
>ottenuto..
>Che tipo di applicazione stai scrivendo?
>

In SQL 2005 si potebbe fare con l 'operatore PIVOT?

--
oggi la mia voglia di lavorare è pari a null

alx_81 Profilo | Guru

>In SQL 2005 si potebbe fare con l 'operatore PIVOT?
Quello che dici è corretto.. ma è di una scomodità .
Considera che non sa quanti numeri di telefono potrà avere un cliente, e quindi dovrebbe comporselo dinamicamente.
Per come è fatto il pivot, preferirei farlo lato codice
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

jenga Profilo | Newbie

>>In SQL 2005 si potebbe fare con l 'operatore PIVOT?
>Quello che dici è corretto.. ma è di una scomodità .
>Considera che non sa quanti numeri di telefono potrà avere un
>cliente, e quindi dovrebbe comporselo dinamicamente.
>Per come è fatto il pivot, preferirei farlo lato codice

Chiarissimo, il ? era per quello.
--
oggi la mia voglia di lavorare è pari a null

alx_81 Profilo | Guru

>Chiarissimo, il ? era per quello.
eheheh.. comunque è corretto
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
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