我有一个大的存储过程,用于返回包含许多选择的对话框的结果。如果特定位列设置为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
Projects表有一个位列AllowIndirectCustomers,它告诉我当值为true时,此项目可以使用其他客户。据我所知,大多数不同的SQL结构都是为了向结果集添加额外的列。我尝试了UNION命令的不同排列,没有运气。通常情况下,我会转向表值函数,但我无法使其适用于此场景。
这个对我来说是一个难题。有什么想法吗?
答案 0 :(得分:2)
所以基本上,你想要在设置标志时否定匹配pp.ProjectID = p.ProjectID
的需要。您可以在JOIN
条件中执行此操作:
JOIN Projects p
ON pp.ProjectID = p.ProjectID OR p.AllowIndirectCustomers = 1
答案 1 :(得分: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