【发布时间】:2018-09-24 06:34:38
【问题描述】:
仅当参数@param 不为空或具有特定值时,我才需要与表 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 */
【问题讨论】:
-
你为什么不总是加入,然后将@param 作为加入的条件?让它成为一个左连接,你可能在做生意。动态更改查询通常不是一个好主意,因为它会与缓存计划和类似性质的东西混淆
-
你想用这个表做 INNER JOIN 吗?如果是这样,您可以在 WHERE 条件下进行。如果您发布一些示例代码,它可能会有所帮助。
-
到目前为止你做了什么?
标签: sql sql-server stored-procedures inner-join