1

我有一个大型存储过程,用于返回具有许多选择的对话框的结果。如果特定位列设置为 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 命令的不同排列,但没有运气。通常,我会使用表值函数,但我无法让它与这个场景一起工作。

这对我来说是一个障碍。有任何想法吗?

4

2 回答 2

2

因此,基本上,您希望在pp.ProjectID = p.ProjectID设置标志时否定匹配的需要。您可以在JOIN标准中做到这一点:

JOIN Projects p
    ON pp.ProjectID = p.ProjectID OR p.AllowIndirectCustomers = 1
于 2013-09-20T20:55:09.407 回答
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 演示

于 2013-09-20T21:04:59.370 回答