none
Query Inner Join solo primo record RRS feed

  • Domanda

  • Salve ragazzi inutile dire che siete i miei eroi, come sempre il problema dietro l'angolo mi blocca.

    Ho creato una query in c#, il database è sqlexpress 2008, questa è la query:

    SELECT * FROM utenti AS u, righeReparti AS r WHERE r.utente = u.id AND (u.cognome LIKE '%" + txtCerca.Text.Replace("'", "''") + "%' OR u.nome LIKE '%" + txtCerca.Text.Replace("'", "''") + "%') AND u.ruolo=@ruolo AND r.repartoID=@reparto

    Ad ogni utente può essere legato più di un reparto, quindi nei risultati della query mi restituice una riga per ogni reparto, ad esempio

    l'utente 1 che ha assegnato il reparto 1, 2, 3

    Il risultato è:

    Utente 1 Reparto 1

    Utente 1 Reparto 2

    Utente 1 Reparto 3

    =============================>

    Io vorrei visualizzare solo un record per ogni utente.


    venerdì 29 maggio 2015 16:37

Risposte

Tutte le risposte


  • Il risultato è:

    Utente 1 Reparto 1

    Utente 1 Reparto 2

    Utente 1 Reparto 3

    =============================>

    Io vorrei visualizzare solo un record per ogni utente.


    Cioè? Essendo che l'utente 1 sia in 3 reparti quale record vorresti recuperare?

    Oppure vuoi un risultato simile a questo?
    Utente 1 Reparto 1 Reparto 2 Reparto 3

    Ciao

    Paolo Pranzo

    venerdì 29 maggio 2015 18:17
  • Essendo una query di ricerca, mi occorre recuperare i valori che soddisfano quella ricerca, non mi interessa sapere di quale reparto fa parte quel utente, ma quale utente fa parte di quel reparto, quindi mettiamo il caso io cerchi un utente in un determinato reparto, con la query attuale l'utente mi viene riproposto tante volte quanti reparti sono associati ad esso, a me interessa che l'utene venga visualizzato solo una volta.

    venerdì 29 maggio 2015 23:10
  • Ma scusa, giusto per comprendere bene il tutto,
    con la seguente condizione "AND r.repartoID=@reparto" non recuperi tutti gli utenti secondo uno specifico reparto?
    Se come parametro reparto, passi il valore 1, mica ti vengono restituiti anche gli utenti facenti parte degli altri reparti?!?
    Probabilmente non riesco io a comprendere bene il tuo problema.

    Paolo Pranzo

    venerdì 29 maggio 2015 23:19
  • Il problema è che la query mi fornisce più risultati per lo stesso utente, ossia per ogni reparto legato al cliente mi restituisce mi restituisce lo stesso risultato.

    Esempio Utente 1 legato a reparto 1, 2 , 3 quindi assegnato a 3 reparti.

    Risultati

    Utente 1       Pinco       Panco

    Utente 1       Pinco       Panco

    Utente 1       Pinco       Panco

    A me interessa un risultato come questo

    Utente 1       Pinco       Panco

    sabato 30 maggio 2015 07:18
  • Il problema è che la query mi fornisce più risultati per lo stesso utente, ossia per ogni reparto legato al cliente mi restituisce mi restituisce lo stesso risultato.

    Esempio Utente 1 legato a reparto 1, 2 , 3 quindi assegnato a 3 reparti.

    Risultati

    Utente 1       Pinco       Panco

    Utente 1       Pinco       Panco

    Utente 1       Pinco       Panco

    A me interessa un risultato come questo

    Utente 1       Pinco       Panco

    Potresti usare la parola chiave DISTINCT

    https://technet.microsoft.com/it-it/library/ms187831%28v=sql.105%29.aspx

    Ma se ti interessa sapere se l'utente c'è o meno, c'è COUNT: se il risultato è zero, l'utente non e' presente. Anche così com'è, la query, se il numero di righe restituite è maggiore di zero, sai che l'utente è presente.


    • Modificato BlueLed sabato 30 maggio 2015 08:59
    sabato 30 maggio 2015 08:58
  • Il problema è che la query mi fornisce più risultati per lo stesso utente, ossia per ogni reparto legato al cliente mi restituisce mi restituisce lo stesso risultato.

    Esempio Utente 1 legato a reparto 1, 2 , 3 quindi assegnato a 3 reparti.

    Risultati

    Utente 1       Pinco       Panco

    Utente 1       Pinco       Panco

    Utente 1       Pinco       Panco

    A me interessa un risultato come questo

    Utente 1       Pinco       Panco

    Ciao, potresti scrivere la struttura della tabella?
    Così possiamo vcerificare la query.

    Ciao

    Paolo Pranzo

    sabato 30 maggio 2015 12:16
  • Tabella "utenti":

    Campo Tipo Dati

    id int (PK)

    userid varchar

    password varchar

    nome varchar

    cognome varchar

    ruolo int

    attivo bit

    loggato bit

    ===========================

    Tabella "righeReparti":

    id  int (PK)

    repartoID int

    utente int

    ============================

    Tabella "ruoli"

    id int (PK)

    ruolo varchar

    Ecco la struttura delle tabelle

    • Proposto come risposta Paolo Pranzo sabato 30 maggio 2015 14:02
    • Proposta come risposta annullata Paolo Pranzo sabato 30 maggio 2015 14:02
    sabato 30 maggio 2015 12:36
  • Il problema è che la query mi fornisce più risultati per lo stesso utente, ossia per ogni reparto legato al cliente mi restituisce mi restituisce lo stesso risultato.

    Esempio Utente 1 legato a reparto 1, 2 , 3 quindi assegnato a 3 reparti.

    Risultati

    Utente 1       Pinco       Panco

    Utente 1       Pinco       Panco

    Utente 1       Pinco       Panco

    A me interessa un risultato come questo

    Utente 1       Pinco       Panco

    Potresti usare la parola chiave DISTINCT

    https://technet.microsoft.com/it-it/library/ms187831%28v=sql.105%29.aspx

    Ma se ti interessa sapere se l'utente c'è o meno, c'è COUNT: se il risultato è zero, l'utente non e' presente. Anche così com'è, la query, se il numero di righe restituite è maggiore di zero, sai che l'utente è presente.


    Grazie per la risposta, 

    ho provato anche con DISTINCT ma nulla, continuo a visualizzare più volte lo stesso utente, con COUNT, ho fatto delle prove , ma da errore oppure non da i risultati sperati.

    sabato 30 maggio 2015 12:43
  • Ho creato su SqlFiddle le tre tabelle inserendo dei dati.
    Togliendo la parte riguardante il nome e cognome (per semplificare il codice) la query funziona correttamente.



    Paolo Pranzo

    sabato 30 maggio 2015 14:09

  • Grazie per la risposta, 

    ho provato anche con DISTINCT ma nulla, continuo a visualizzare più volte lo stesso utente, con COUNT, ho fatto delle prove , ma da errore oppure non da i risultati sperati.

    La query di partenza sembra un pò campata in aria:

    1.

    Sintatticamente le virgolette non fanno corretta corrispondenza le une con le altre ed anche gli apostrofi e i due tipi sembrano accavallarsi.

    2.

    Inoltre i termini per la join non sembrano avere molto senso anche a livello di tabelle.

    "utenti" dovrebbe avere un campo repartoId e "righeReparti" non dovrebbe avere un campo utente.

    E nella condizione in cui unisci le tabelle dovrebbe essere:

    u.repartoId = r.Id

    3.

    Anche l'uso dei parametri @ruolo e @reparto non si capisce bene, dato che quando hai voluto parametrizzare (nell'OR) più che usare i parametri, hai concatenato stringhe.

    Al limite ti converrebbe spiegare la logica secondo cui hai strutturato tabelle e query.


    • Modificato BlueLed sabato 30 maggio 2015 15:06
    sabato 30 maggio 2015 14:16
  • Ho creato su SqlFiddle le tre tabelle inserendo dei dati.
    Togliendo la parte riguardante il nome e cognome (per semplificare il codice) la query funziona correttamente.



    Paolo Pranzo

    Ciao Paolo, infinite grazie per la collaborazione, ho provato il codice in effetti, la cosa funziona così, il problema nasce però quando, non specifico, (essendo vari filtri in cascata), il reparto, quindi in quel caso mi da più risultati per lo stesso utente...

    SELECT * FROM utenti AS u, righeReparti AS r WHERE r.utente = u.id AND (u.cognome LIKE '%" + txtCerca.Text.Replace("'", "''") + "%' OR u.nome LIKE '%" + txtCerca.Text.Replace("'", "''") + "%') AND u.ruolo=@ruolo AND r.repartoID=@reparto

    infatti se vedi il codice postato sopra vi è il filtro ruolo, se ad esempio, lascio vuoto reparto, il problema persiste, invece la mia necessità è quella di avere per ogni utente un solo risultato, indipendentemente dalla query

    sabato 30 maggio 2015 14:22
  • Infatti ho modificato il tuo sqlfiddle togliendo la reparto dalla relazione e si ripresentano tutti i risultati
    sabato 30 maggio 2015 14:28
  • Infatti ho modificato il tuo sqlfiddle togliendo la reparto dalla relazione e si ripresentano tutti i risultati

    E' normale, 

    perché a prescindere dal reparto, il ruolo è sempre 1 e quindi soddisfa la query. Dovresti gestire meglio la relazione tra le tre tabelle.
    Spiega nel dettaglio la logica delle tabelle come suggerisce anche BlueLed, magari possiamo trovare una migliore.

    Ciao


    Paolo Pranzo

    sabato 30 maggio 2015 14:34
  • Grazie per le risposte e per l'immenso aiuto, provando, riprovando, sbagliando e ri-sbagliando, ho capito di aver utilizzato in maniera errata la parola chiave DISTINCT in maniera errata e quindi l'avevo accantonata credendo non andasse bene nel mio caso, devo fare delle prove ma posso dire che il problema sia risolto....

    Per completezza posto il link di riferimento:

    https://technet.microsoft.com/it-it/library/ms187831%28v=sql.105%29.aspx

    Grazie ancora per l'aiuo

    • Contrassegnato come risposta CrysisZone domenica 31 maggio 2015 14:15
    domenica 31 maggio 2015 14:15