INNER JOIN仅在条件满足时才会发生

时间:2013-06-15 08:41:07

标签: sql sql-server tsql left-join inner-join

如果不满足条件,我试图“短路”INNER JOIN。

我尝试了什么:
我发现如果左连接在“ON”条件下前面有一个False子句,则LEFT JOIN失败。因此,我尝试用LEFT OUTER JOIN模拟INNER JOIN,WHERE子句得到如下的执行计划:

DECLARE @a nvarchar(4) = 'All'

SELECT A.*
FROM [dbo].[your_table] A
LEFT JOIN [dbo].[your_table_2] B
     ON @a <> 'All'
WHERE A.City_Code = CASE WHEN @a <> 'All' 
                    THEN B.City_Code 
                    ELSE A.City_Code END

这会使左连接“短路”并且永远不会发生。执行计划如下:

enter image description here

但是当我试图通过将变量声明为'Al'而不是'All'来执行相同的语句时,我看到执行计划仍然是相同的。

enter image description here

如果在最初的步骤中发生了加入,我感到困惑吗?

我想要的是什么:
我想知道上述方法是否正确?这真的是INNER JOIN的短路吗?
我基本上希望INNER JOIN只在变量不是'All'时在两个表之间发生,否则它不应该JOIN并继续继续。我已经尝试过使用“OR”(短路)和“IN”(应用过滤器),但如果IN子句中的项目太多,性能会降低。
请帮助我,告诉我在我的方法中我是否错了。

示例数据:

我应该只在变量&lt;&gt;时得到INNER JOIN结果'所有' enter image description here

当变量='全部'时,我应该得到表A,即

enter image description here

注意:我简化了这个查询,因此看起来简单的if语句可以做到。实际上我有53个参数需要检查并运行JOINS。加上一个查询的结果集必须与另一个查询相结合,即我在此之前有几个其他的JOIN条件:)

2 个答案:

答案 0 :(得分:0)

你有没有试过像

这样的东西
SELECT  A.*
FROM    [dbo].[your_table] A
WHERE   EXISTS  (
            SELECT  1
            FROM    [dbo].[your_table_2] B
            WHERE   A.City_Code = B.City_Code
        )
OR  @a = 'All'

答案 1 :(得分:0)

您是否尝试过案例陈述? CASE或DECODE通常类似于SQL中的IF-ELSE语句。