【问题标题】:JOIN with table only if parameter condition is met仅当满足参数条件时才与表连接
【发布时间】: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


【解决方案1】:

在 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...

【讨论】:

  • select * 可能不合适。
  • 对,星星当然只是为了简单。字段应在最终选择中枚举。
  • 。 .不是这个。如this answer中所述,结果集将包含OP在查询中不想要的表中的列。值将是NULL,但列将在那里。
【解决方案2】:

有不同的解决方案:

1 - 您可以通过连接字符串动态创建您的 sql 语句并通过 sp_executesql 运行它

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

【讨论】:

  • 提示:永远不要做选项 1
  • 老实说,我认为选项 2 对这种情况也没有意义,但如果没有看到他的询问就很难说
【解决方案3】:

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

如果是这样,我可能会建议改用exists:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2019-02-12
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2021-08-21
    • 2020-01-10
    相关资源
    最近更新 更多