我试图“短路”的内部连接,如果条件不满足。
我尝试了什么:
我发现,如果左联接前面有一个关于" on“条件的False子句,则左联接将失败。因此,我尝试用左外部联接模拟内部联接,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’来执行相同的语句时,我发现执行计划仍然是一样的。

我很困惑加入是否发生在第一步?
我想要的:
我想知道上述方法是否正确?内部连接真的短路了吗?
我基本上希望内部连接发生在两个表之间,只有当变量不是'All‘时,它就不应该加入并继续下去。我已经尝试过使用"OR“(用于短路)和" in”(应用过滤器),但是如果IN子句中有太多项,性能就会减慢。
请帮助我,一定要告诉我,如果我的方法是错误的任何地方。
样本数据:
只有在变量<> 'all‘时才能得到内部连接结果

当变量= 'All‘时,我应该得到表A。

注意:,我简化了这个查询,因此看起来简单的if语句可以做到。实际上,我有53个参数,我需要检查和运行联接。另外,必须将一个查询的结果集与另一个查询连接,即在此之前有几个其他联接条件:)
发布于 2013-06-15 08:45:28
你试过像
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'发布于 2013-06-15 09:56:05
你试过案例陈述了吗?大小写或解码通常类似于SQL中的IF-SQL语句。
https://stackoverflow.com/questions/17121754
复制相似问题