Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Ottenere il recordset della query opposta

    Ho una query difficilotta che non riesco a risolvere

    Ho una lista di utenti che filtro tramite una lista di categorie (una combo multipla)

    Ho due combo per mostrare la lista di utenti presenti nelle categorie.

    La prima mi mostra i record di una tabella filtrati tramite una condizione (quelli presenti nelle categorie selezionate nel filtro).
    La seconda mi mostra i record opposti; cioè tutti i record restanti della tabella che sono stati esclusi.

    La query per la prima combo è:
    codice:
    SELECT DISTINCT E.IdEmail, E.Nominative, E.Email 
    FROM TbEmNL E 
    LEFT JOIN TbEm_Cat_NL EC ON EC.IdEmail= E.IdEmail 
    WHERE Abilitato = 1 AND (EC.IdCatNL IS NULL OR EC.IdCatNL IN (2,4,5) ) 
    ORDER BY E.Nominative DESC, E.Email DESC, E.IdEmail
    Ora il problema è con la 'IN'.
    Infatti per fare la cosa opposta non basta una 'NOT IN', visto che uno stesso utente può avere più categorie, e quindi può riapparire.

    Se per esempio ho un utente nella categoria 2 e nella 3 mi verrà mostrato in entrambe le combo.


    Come posso evitare che questo accada?

    Come devo scrivere la WHERE per non mostrare i record riguardanti gli IdEmail (gli utenti) che hanno almeno una categoria in quelle elencate nella 'IN'?


    Credo sia abbastanza semplice ma non mi viene l'intuizione su come fare

    Mi date un aiuto?

    Grazie mille,

    Pictor

  2. #2

  3. #3
    No appunto ho già specificato che così non può funzionare.

    Questo perchè il rapporto tra utenti e categorie è N:N.


    Quel tuo "NOT IN" mi potrebbe provocare dei duplicati tra le due select.

    Comunque ho risolto.
    Per la seconda select basta fare una sottoquery che prende tutti gli id degli utenti ricavati nella prima select e poi si usa come filtro facendo:

    La prima query è:
    codice:
    SELECT * FROM tabellaUtenti WHERE idcategoria IN (<valori>)
    mentre la seconda è
    codice:
    SELECT * FROM tabellaUtenti WHERE idutente NOT IN (SELECT * FROM tabellaUtenti WHERE idcategoria IN (<valori>))
    Così pare funzionare.
    Comunque il problema dei duplicati è perchè ci sono anche utenti che non hanno una categoria.
    Quindi la categoria risultante è NULL.

    Grazie lo stesso

  4. #4
    penso che ci voglia una NOT IN (tutti la prima query)

  5. #5
    Sì infatti



    Ah comunque mi si è complicata anche enormemente perchè tra i valori della IN non accettava NULL.

    Sapete mica come farglielo considerare come un normale valore? (magari qualche tipo di casting)
    Avrebbe reso tutto semplicissimo e invece mi trovo a dover gestire in ASP il caso particolare degli utenti senza categoria.

    In fondo l'idcategoria può assumere valore numerico oppure NULL..... non capisco perchè invece una query come:

    codice:
    WHERE idcategoria IN (1,3,4,7,NULL)
    non mi consideri il valore NULL.

    Sapete darmi un suggerimento?

    Thanks guys

  6. #6

  7. #7
    Essì, ma appunto volevo che mi prendesse il NULL fra i valori della IN

    Era per evitarmi tutta la gestione della query lato server che va modificata controllando se ho il valore NULL e quindi aggiungere un pezzo e altre menate varie.


    Speravo in un qualche casting che permettesse alla IN di poter considerare anche il NULL.

    Ma immagino sia totalmente impossibile

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.