2009-09-14 17 views
6

Sto lavorando a un'applicazione per la prenotazione dei dipendenti. Ho due entità differenti, Progetti e Utenti a cui è stato assegnato un numero variabile di abilità.Come confrontare/confrontare i valori in due gruppi di risultati in SQL Server 2008?

Ho una tabella di abilità con le diverse competenze (colonne: id, nome) mi registro delle competenze degli utenti in una tabella chiamata UserSkills (con due colonne di chiave esterna: fk_user e fk_skill) posso registrare le competenze del progetto in un'altra tabella denominata ProjectSkills (con due colonne chiave esterna: fk_project e fk_skill).

Un progetto può richiedere forse 6 diverse abilità e gli utenti al momento della registrazione impostano anche le loro Abilità.

La parte difficile è quando devo trovare utenti per i miei progetti in base alle loro competenze. Mi interessano solo gli utenti che incontrano che hanno TUTTE le competenze richieste dal progetto. Gli utenti sono spesso autorizzati ad avere più esperti richiesti.

Il seguente codice non funziona, (e anche se lo facesse, non sarebbe molto prestazioni amichevole), ma illustra la mia idea:

SELECT * FROM Users u WHERE 
    (SELECT us.fk_skill FROM UserSkills us WHERE us.fk_user = u.id) 
     >= 
    (SELECT ps.fk_skill FROM ProjectSkills ps WHERE ps.fk_project = [some_id]) 

sto pensando di fare la mia funzione che prende due variabili TABLE, e poi elaborando il confronto in questo (una sorta di funzione IN modificata), ma preferirei trovare una soluzione che sia più adatta alle prestazioni.

che sto sviluppando in SQL Server 2008.

Apprezzo molto tutte le idee o suggerimenti su questo. Grazie!

risposta

6
SELECT * 
FROM Users u 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM ProjectSkill ps 
     WHERE ps.pk_project = @someid 
       AND NOT EXISTS 
       (
       SELECT NULL 
       FROM UserSkills us 
       WHERE us.fk_user = u.id 
         AND us.fk_skill = ps.fk_skill 
       ) 
     ) 
+1

OMG! Hai risposto con la risposta corretta dopo solo 2 minuti e mezzo! Tu sei il mio eroe! ;) Questa è stata la mia prima domanda su StackOverflow, ma sicuramente non è la mia ultima ... Grazie, il tuo aiuto è molto apprezzato! –

+0

Zounds. C'è un sito web da qualche parte che enuncia e chiarisce i come e perché per questo uso di sottoquery correlate? –

+0

'@Philip Kelley': Attualmente sto scrivendo una serie di articoli su' NOT IN' vs 'NOT EXISTS' vs' LEFT JOIN/IS NULL' in diversi 'RDBMS'. – Quassnoi

0
-- Assumes existance of variable @ProjectId, specifying 
-- which project to analyze 
SELECT us.UserId 
from UserSkills us 
    inner join ProjectSkills ps 
    on ps.SkillId = us.SkillId 
    and ps.ProjectId = @ProjectId 
group by us.UserId 
having count(*) = (select count(*) 
        from ProjectSkills 
        where ProjectId = @ProjectId) 

che ci si vuole testare un debug di questo, come non ho i dati di test per eseguirlo attraverso. Idem per l'indicizzazione per ottimizzarlo.

(ora per lasciare, e vedere se qualcuno è venuto su con un modo migliore - ci dovrebbe essere qualcosa di più sottile ed efficace di questo.)

Problemi correlati