У меня есть хранимая процедура, которая может иметь от 1 до 4 переменных, переданных ей, и она должна возвращать строки, в которых соответствует большинство столбцов, или если нет соответствующих записей, они возвращают значения по умолчанию (которые равны нулю). Последовательность должна быть отличной.SQL Server выбирает, где большинство столбцов соответствует
Пример таблицы с данными:
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
Таким образом, результаты для Клиента 100, любой проект, фаза или задача была бы просто по умолчанию NULL записи Криса и Боба. Для Клиента 500 результатом будут Джо и Боб. Для клиента 500, Project 2 результатом будут Макс и Боб. Сейчас я делаю этот запрос, сначала проверяя задачу, а затем присоединяю ее к запросу по фазе и проверяю, не перекрываются ли строки и делают то же самое для проекта, а затем для клиента. Это кажется невероятно неэффективным, и в этом должен быть более умный способ. Есть предположения?
EDIT - Некоторые примеры запросов, я проверяю первый для случая, когда все совпадает
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
Тогда я делаю запросы меньше и менее специфичны и проверить, что последовательность не существует.
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)
Какая версия SQL Server? – Matthew
'Для клиента 500, Project 2 результатом будет Макс и Боб.« Не нужно ли просто вернуть Max для этого? –
Абэ поднимает хороший момент, как Боб является действительным результатом для Client 500, Project 2, но Крис нет? – Seph