Problema con una Join

lunedì 01 dicembre 2008 - 22.14

luxsor Profilo | Guru

Ho un problema con questa query, cioè:
Ho 3 tabelle (Clienti, Lavori e Decoder)
La mia query mi dovrebbe restituire:
Tabella Clienti: Nome, Cognome
Tabella Lavori: IndiceDecoder
Tabella Decoder: mdecoderlasciato

SELECT clienti.cognome, clienti.nome, lavori.odl, lavori.indicedecoder, decoder.mdecoderlasciato, lavori.idlavoro
FROM clienti INNER JOIN
lavori ON clienti.idcliente = lavori.idcliente INNER JOIN
decoder ON lavori.indicedecoder = decoder.iddecoder
WHERE lavori.idlavoro=5

Il problema è che dando un es. IDLAVORO=5 mi restituisci 3 volte la stessa riga, mentre nel database vi è sono 1 riga



motogpdesmo16 Profilo | Senior Member

>Ho un problema con questa query, cioè:
>Ho 3 tabelle (Clienti, Lavori e Decoder)
>La mia query mi dovrebbe restituire:
>Tabella Clienti: Nome, Cognome
>Tabella Lavori: IndiceDecoder
>Tabella Decoder: mdecoderlasciato
>
>SELECT clienti.cognome, clienti.nome, lavori.odl, lavori.indicedecoder,
>decoder.mdecoderlasciato, lavori.idlavoro
>FROM clienti INNER JOIN
>lavori ON clienti.idcliente = lavori.idcliente INNER JOIN
>decoder ON lavori.indicedecoder = decoder.iddecoder
>WHERE lavori.idlavoro=5
>
>Il problema è che dando un es. IDLAVORO=5 mi restituisci 3 volte
>la stessa riga, mentre nel database vi è sono 1 riga

I vari campi Id sono stati definiti come identità??
Leggendo la tua query mi è sembrata corretta ma, per verifica, ho provato a riprodurre il tuo database sul mio sql server.

Create database prova use prova Create table Clienti (Id_clienti int identity(1,1),Nome varchar(50),Cognome varchar(50)) Create table Decoder (Id_Decoder int identity(1,1), Descrizione varchar(50)) Create Table Lavori (Id_lavori int identity(1,1),Id_Clienti int, Id_Decoder int) Insert into Clienti (Nome,Cognome) VALUES ('Nome1', 'Cognome1') Insert into Clienti (Nome,Cognome) VALUES ('Nome2', 'Cognome2') Insert into Clienti (Nome,Cognome) VALUES ('Nome3', 'Cognome3') ------------------ Insert Into Decoder (Descrizione) VALUES ('Sky') Insert Into Decoder (Descrizione) VALUES ('Stream') Insert Into Decoder (Descrizione) VALUES ('Mediaset') -------------- Insert Into Lavori (Id_Clienti, Id_Decoder) values (1,2) Insert Into Lavori (Id_Clienti, Id_Decoder) values (1,3) Insert Into Lavori (Id_Clienti, Id_Decoder) values (2,2) Insert Into Lavori (Id_Clienti, Id_Decoder) values (3,1) Insert Into Lavori (Id_Clienti, Id_Decoder) values (3,3) Insert Into Lavori (Id_Clienti, Id_Decoder) values (3,2) Select * from clienti inner join Lavori on Lavori.id_clienti = Clienti.id_clienti inner join Decoder on Decoder.Id_Decoder = lavori.id_decoder Where lavori.id_lavori = 4
Il risultato che ottengo dalla query è sempre univoco. Prova a controllare quindi l'univocità dei dati.

luxsor Profilo | Guru


Si restituisce 3 righe perchè nella tabella decoder vi sono 3 elementi che corrispondono allo stesso ID.
E' possibile far uscire tutti e 3 gli elementi della tabella Decoder, nella stessa query di partenza?
Altrimenti lo dovrò fare tramite codice..


allora nella tabella

Clienti IDCliente è IDENTITA'
Lavori IDLavoro è IDENTITA'
invece nella tabella
Decoder IDDecoder è un integer

Come posso di assegnare un valore nullo al campo DateTime?
perchè se lascio vuoto la mi genera un'eccezione...

motogpdesmo16 Profilo | Senior Member

>
>Si restituisce 3 righe perchè nella tabella decoder vi sono 3
>elementi che corrispondono allo stesso ID.
>E' possibile far uscire tutti e 3 gli elementi della tabella
>Decoder, nella stessa query di partenza?
>Altrimenti lo dovrò fare tramite codice..
>
>
>allora nella tabella
>
>Clienti IDCliente è IDENTITA'
>Lavori IDLavoro è IDENTITA'
>invece nella tabella
>Decoder IDDecoder è un integer
>
>Come posso di assegnare un valore nullo al campo DateTime?
>perchè se lascio vuoto la mi genera un'eccezione...
>
>
Secondo me è errata l'impostazione delle tabelle: mi spiego meglio. L'entità lavoro per me è l'associazione di due altre entità "CLIENTE" e "DECODER" pertanto è il "LAVORO" che deve essere univoco e non il decoder.
Se non devi riscrivere tutto da zero, prova a seguire la mia strada..magari ti trovi anche meglio!
Relativamente al campo null, se utilizzi il Sql Server Management Studio, devi impostare il flag "Ammetti null" di fianco alla definizione della colonna.

luxsor Profilo | Guru

>pertanto è il "LAVORO" che deve essere univoco e non il decoder
Cosa intendi per univoco?

La tabella LAVORO ha un ID Univoco infatti rappresenta l'identity
invece la tabella DECODER contiene la lista dei decoder che verranno poi associati ai singoli LAVORI.

Nel il campo NULL, il flag è abilitato ad ammettere valori null, ma con VB 2008 non so come assegnare questo valore, perchè se lascio vuoto il campo nella query, mi genera un'eccezione.

motogpdesmo16 Profilo | Senior Member

>>pertanto è il "LAVORO" che deve essere univoco e non il decoder
>Cosa intendi per univoco?
>
>La tabella LAVORO ha un ID Univoco infatti rappresenta l'identity
>invece la tabella DECODER contiene la lista dei decoder che verranno
>poi associati ai singoli LAVORI.
>
>Nel il campo NULL, il flag è abilitato ad ammettere valori null,
>ma con VB 2008 non so come assegnare questo valore, perchè se
>lascio vuoto il campo nella query, mi genera un'eccezione.
>
Intendo dire che concettualmente è l'idea di associazione Codice Cliente-Codice Decoder che deve essere univoca. Tale associazione si traduce poi nell'entità Lavoro.
Probabilmente mi sta sfuggendo qualcosa in termini di tabelle. Puoi postare, in maniera molto sintetica magari, quali sono i campi fondamentali delle tue tabelle e quali sono i vincoli di foreign key tra di loro?

luxsor Profilo | Guru

Ti ringrazio per la disponibilità, ma ho risolto facendo una prima query per tutti i valori principali e una seconda query che mi estrae sono i decoder per il singolo lavoro.

motogpdesmo16 Profilo | Senior Member

Mi fa piacere abbia risolto.
Ma sono tuttavia convinto che si possa decisamente ottimizzare la cosa!
Marca il thread come risolto così chiudiamo il topic!
ciao
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5