仅在满足参数条件时才与表连接

时间:2018-04-13 20:38:58

标签: sql sql-server stored-procedures inner-join

只有当参数@param不为null或者它具有特定值时,我才需要与表B进行连接。

我不想添加IF / ELSE,因为商店对此非常重要。

我的商店返回超过50个参数,并与10个表连接。

如果声明的@param条件满足,我只想跳过其中一个连接。

我希望有人可以帮助我。 提前谢谢!

更新

DECLARE @param INT = NULL;

SELECT 
    /* HERE GOES A LOOT OF PARAMETERS */
FROM 
    T0 T
    INNER JOIN  T1 B ON T.attr1 = B.attr1
    LEFT JOIN   T2 TFD ON T.attr2 = TFD.attr2
    LEFT JOIN   T3 TTT ON (TTT.attr3 = TFD.attr3)
    INNER JOIN  T4 U ON B.attr4 = U.attr5 AND U.attr6 = @attr6
    -- The following commented section is the one that i want to skip if @param is NULL
    /*LEFT JOIN @tvp P ON  (
                            (P.attr11= TFD.attr9 AND T.attr8 = P.attr8 AND P.attr7 = 1) OR 
                            (P.attr11 = TFD.attr9 AND T.attr8 = P.attr8 AND P.attr7 = 0 AND B.attr4 = @attr5) OR 
                            (TFD.attr9 IS NULL AND P.attr8 = T.attr8)
                                    )*/
    LEFT JOIN   T4 FTB ON FTB.attr1 = B.attr1
    LEFT JOIN   T6 S ON S.attr10 = T.attr10
    LEFT JOIN   @splittedElementsIds SETI ON SETI.item = T.attr9
    WHERE
        (@attr9 IS NULL OR T.attr9 = SETI.item)
    GROUP BY
        /* LOOTS OF GROUP BY PARAMETERS */

3 个答案:

答案 0 :(得分:2)

在ON子句中使用@param条件,这是一个例子:

select * from A
  left join B on A.id = B.id and @param1 = 'X'
  left join C on A.id = C.id and @param2 = 'Y'
  etc...

答案 1 :(得分:0)

有不同的解决方案:

1 - 您可以通过查询字符串并通过sp_executesql运行它来动态创建sql语句

2 - 使用Union all如下

假设t2是您有条件加入的表格,@param是您想要根据

做的条件
;With query as 
(Select * from t1
 inner join t3
 inner join t3)

Select * from query
Where @param = 1

union all 

Select * from query
inner join t2
Where @param = 2

答案 2 :(得分:0)

SQL查询返回一组固定的列。有问题的join - 因为它是可选 - 似乎不会返回查询中的任何列。因此,我认为它仅用于过滤。

如果是这样,我建议改为使用exists

select . . .
from . . .
where @param <> 'true' or exists (select 1 from b where b.? = x.?)