如果不满足条件,我试图“短路”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
这会使左连接“短路”并且永远不会发生。执行计划如下:
但是当我试图通过将变量声明为'Al'而不是'All'来执行相同的语句时,我看到执行计划仍然是相同的。
如果在最初的步骤中发生了加入,我感到困惑吗?
我想要的是什么:
我想知道上述方法是否正确?这真的是INNER JOIN的短路吗?
我基本上希望INNER JOIN只在变量不是'All'时在两个表之间发生,否则它不应该JOIN并继续继续。我已经尝试过使用“OR”(短路)和“IN”(应用过滤器),但如果IN子句中的项目太多,性能会降低。
请帮助我,告诉我在我的方法中我是否错了。
示例数据:
我应该只在变量&lt;&gt;时得到INNER JOIN结果'所有'
当变量='全部'时,我应该得到表A,即
注意:我简化了这个查询,因此看起来简单的if语句可以做到。实际上我有53个参数需要检查并运行JOINS。加上一个查询的结果集必须与另一个查询相结合,即我在此之前有几个其他的JOIN条件:)
答案 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语句。