好吧,我知道有一些帖子讨论了这个问题,但我的问题不能通过连接上的条件 where 语句(常见解决方案)来解决。
我有三个 join
语句,根据查询参数,我可能需要运行这三个语句的任意组合。我的 Join 语句非常昂贵,因此我只想在查询需要时才进行连接,并且我不准备编写 7 个组合 IF..ELSE..
语句来实现这些组合.
这是我迄今为止所使用的解决方案,但所有这些都不太理想:
LEFT JOIN joinedTable jt
ON jt.someCol = someCol
WHERE jt.someCol = conditions
OR @neededJoin is null
(这太昂贵了,因为即使我不需要它,我也会执行连接,只是不评估连接)
OUTER APPLY
(SELECT TOP(1) * FROM joinedTable jt
WHERE jt.someCol = someCol
AND @neededjoin is null)
(这比总是离开加入更昂贵)
SELECT @sql = @sql + ' INNER JOIN joinedTable jt ' +
' ON jt.someCol = someCol ' +
' WHERE (conditions...) '
(这是 IDEAL,以及它现在的编写方式,但我正在尝试将其从动态 SQL 中转换出来)。
任何想法或帮助都会很棒!
编辑: 如果我采用动态 SQL 方法,我会尝试找出在构建查询方面最有效的方法。鉴于我有三个可选条件,并且我需要所有这些条件的结果,我当前的查询会执行如下操作:
IF condition one
SELECT from db
INNER JOIN condition one
UNION
IF condition two
SELECT from db
INNER JOIN condition two
UNION
IF condition three
SELECT from db
INNER JOIN condition three
我的非动态查询通过执行左连接来完成此任务:
SELECT from db
LEFT JOIN condition one
LEFT JOIN condition two
LEFT JOIN condition three
WHERE condition one is true
OR condition two is true
OR condition three is true
哪一个更有意义?因为“SELECT from db”语句中的所有代码都是相同的?看来联合条件更有效,但我的查询因此非常长......
谢谢!
最佳答案
LEFT JOIN
joinedTable jt ON jt.someCol = someCol AND jt.someCol = conditions AND @neededjoin ...
...
或者
LEFT JOIN
(
SELECT col1, someCol, col2 FROM joinedTable WHERE someCol = conditions AND @neededjoin ...
) jt ON jt.someCol = someCol
...
或者
;WITH jtCTE AS
(SELECT col1, someCol, col2 FROM joinedTable WHERE someCol = conditions AND @neededjoin ...)
SELECT
...
LEFT JOIN
jtCTE ON jtCTE.someCol = someCol
...
说实话,除非使用文字,否则不存在条件 JOIN 这样的构造。
如果它在 SQL 语句中,则会对其进行评估...所以不要使用动态 SQL 或 IF ELSE 将其放在 SQL 语句中
关于sql - 我需要某种条件连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3789964/