首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内连接只应在满足条件时发生。

内连接只应在满足条件时发生。
EN

Stack Overflow用户
提问于 2013-06-15 08:41:06
回答 2查看 3.5K关注 0票数 0

我试图“短路”的内部连接,如果条件不满足。

我尝试了什么:

我发现,如果左联接前面有一个关于" on“条件的False子句,则左联接将失败。因此,我尝试用左外部联接模拟内部联接,WHERE子句得到了如下执行计划:

代码语言:javascript
运行
复制
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个参数,我需要检查和运行联接。另外,必须将一个查询的结果集与另一个查询连接,即在此之前有几个其他联接条件:)

EN

回答 2

Stack Overflow用户

发布于 2013-06-15 08:45:28

你试过像

代码语言:javascript
运行
复制
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'
票数 0
EN

Stack Overflow用户

发布于 2013-06-15 09:56:05

你试过案例陈述了吗?大小写或解码通常类似于SQL中的IF-SQL语句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17121754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档