2013-09-20 9 views
1

У меня есть большая хранимая процедура, которая используется для возврата результатов для диалога со многими выборами. У меня есть новые критерии для получения «лишних» строк, если для определенного столбца бит установлено значение true. Текущая настройка выглядит следующим образом:Извлеките дополнительные строки, если бит бит равен true

SELECT 
    CustomerID, 
    FirstName, 
    LastName, 
    ... 
FROM HumongousQuery hq 
LEFT JOIN (
    -- New Query Text 
) newSubQuery nsq ON hq.CustomerID = nsq.CustomerID 

Я имею первую половину нового запроса:

SELECT DISTINCT 
    c.CustomerID, 
    pp.ProjectID, 
    ep.ProductID 
FROM Customers c 
JOIN Evaluations e (NOLOCK) 
    ON c.CustomerID = e.CustomerID 
JOIN EvaluationProducts ep (NOLOCK) 
    ON e.EvaluationID = ep.EvaluationID 
JOIN ProjectProducts pp (NOLOCK) 
    ON ep.ProductID = pp.ProductID 
JOIN Projects p 
    ON pp.ProjectID = p.ProjectID 
WHERE 
    c.EmployeeID = @EmployeeID 
    AND e.CurrentStepID = 5 
    AND p.IsComplete = 0 

таблица Проекты имеет несколько столбцы, AllowIndirectCustomers, который говорит мне, что этот проект может использовать дополнительным клиентов, когда значение истинно. Насколько я могу судить, большинство различных SQL-конструкций предназначены для добавления дополнительных столбцов в набор результатов. Я пробовал разные перестановки команды UNION, не повезло. Обычно я обращался к табличной функции, но мне не удалось заставить ее работать с этим scenerio.

Этот был для меня наворотом. Есть идеи?

+0

Как определить, если клиент должен быть включен? И когда вы позволяете косвенно, а когда нет. – zimdanen

+0

Вышеупомянутый запрос предназначен для непосредственных присвоений конкретному сотруднику. Этот используется независимо от флага бит. В основном косвенные - это клиенты, которые назначаются сотруднику, имеют один и тот же продукт, но находятся в другом проекте. –

+0

Проверьте ниже и дайте мне знать, если это сработает для вас. – zimdanen

ответ

2

Так что в основном вы хотите свести на нет необходимость соответствовать pp.ProjectID = p.ProjectID, когда установлен флаг. Вы можете сделать это право в JOIN критерии:

JOIN Projects p 
    ON pp.ProjectID = p.ProjectID OR p.AllowIndirectCustomers = 1 
+0

Чехол с гранью, Бэтмен! Не знал, что вы можете сделать это с помощью OR в JOIN. Сегодня узнал что-то новое. :) –

0

В зависимости от сложности ваших таблиц, это может не работать слишком легко, но вы могли бы сделать case заявления на ваш bit колонка. Что-то вроде этого:

select table1.id, table1.value, 
case table1.flag 
    when 1 then 
     table2.value 
    else null 
end as secondvalue 
from table1 
left join table2 on table1.id = table2.id 

Вот SQL Fiddle demo

+1

Я бы хотел дать вам +1 только для вашего имени пользователя. Но похоже, что OP хочет добавить строки, а не изменять значение строк, которые у него уже есть. – zimdanen

+0

@zimdanen, ты совершенно прав. –

Смежные вопросы