J'ai une procédure stockée qui peut avoir 1 à 4 variables passées et il doit retourner les lignes où la plupart des colonnes correspondent ou s'il n'y a pas d'enregistrements correspondants, il retourne ceux par défaut (qui sont nuls). La séquence doit être distincte.SQL Server sélectionner où la plupart des colonnes correspondent
Exemple de tableau avec des données:
Client_Id Project_ID Phase Task Employee Sequence
--------- ---------- ----- ---- -------- --------
NULL NULL NULL NULL Chris 1
NULL NULL NULL NULL Bob 100
500 NULL NULL NULL Joe 1
500 2 NULL NULL Max 1
Ainsi, les résultats pour le client 100, tout projet, phase ou tâche serait tout simplement les enregistrements NULL par défaut de Chris et Bob. Pour le client 500, les résultats seraient Joe et Bob. Pour le client 500, projet 2, le résultat serait Max et Bob. En ce moment je fais cette requête en vérifiant d'abord la tâche puis en la joignant avec une requête par phase et en vérifiant qu'aucune ligne ne se chevauche et fait la même chose pour le projet que pour le client. Cela semble incroyablement inefficace et il doit y avoir un moyen plus intelligent à ce sujet. Des pensées?
EDIT - Quelques exemples de requête, je vérifie d'abord pour le cas où tout correspond
insert into #TempTracking
select p.employee, p.sequence
from invoices i, projects p
where i.client_id = p.client_id
and i.project_no = p.project_no
and i.phase = p.phase
and i.task = p.task
Ensuite, je fais les requêtes de moins en moins spécifiques et vérifiez que la séquence n'existe pas déjà.
insert into #TempTracking
select p.employee, p.sequence
from invoices i, projects p
where (i.client_id = p.client_id or i.client_id is null)
and (i.project_no = p.project_no or i.project_no is null)
and (i.phase = p.phase or i.phase is null)
and (i.task = p.task or i.task is null)
and NOT EXISTS (SELECT * FROM #TempTracking t WHERE t.sequence = p.sequence)
Quelle version de SQL Server? – Matthew
'Pour le Client 500, Projet 2, le résultat serait Max et Bob. Cela ne devrait-il pas renvoyer Max à celui-ci? –
Abe soulève un bon point, comment Bob est-il un résultat valide pour Client 500, Projet 2 mais Chris ne l'est pas? – Seph