根据条件选择加入表

Posted

技术标签:

【中文标题】根据条件选择加入表【英文标题】:Select joining table based on condition 【发布时间】:2016-04-12 19:50:49 【问题描述】:

我有 3 张桌子

    表A 表B 表C

我需要根据传递的参数将 TableA 与 TableB 或 TableC 连接起来。 即

select * from 
TableA A 
join (TableB on <Joining Condition> /  TableC on <joining condition> )

我尝试了以下查询

select * from 
TableA A 
join (
   case when paramB<>'' then TableB on <Joining Condition>
   case when paramC<>'' then TableC on <joining condition>
 )

但是,这是语法错误。 有人可以帮忙吗?

解决方案:

create table #temp (<columns>)
if paramB<>''
begin
   select * from 
   TableA A 
   join TableB on <Joining Condition>
end
else if paramB<>''
begin
  select * from 
   TableA A 
   join TableC on <Joining Condition>
end

【问题讨论】:

你试过动态sql吗? 我不想使用动态查询。有没有其他方法..? 你需要使用动态sql查询。 你必须使用动态查询 if-else 语句怎么样?还是您希望在单个查询中进行此操作? 【参考方案1】:

第 1 步:使用 reqd.columns 创建一个临时表 step-2 : 如果 paramB 有值,加入 TableB 否则加入 TableC。

create table #temp (<columns>)
if paramB<>''
begin
   select * from 
   TableA A 
   join TableB on <Joining Condition>
end
else if paramB<>''
begin
 select * from 
 TableA A 
 join TableC on <Joining Condition>
end

【讨论】:

您应该尝试解释代码的工作原理以及它如何回答问题,而不是简单地发布代码。【参考方案2】:

您可以使用UNION ALL

select *
from a
join TableB on <join condition>
where paramB <> ''

union all

select *
from a
join TableC on <join condition>
where paramC <> ''

注意TableBTableC的列数和数据类型必须相同,否则会报错。

【讨论】:

【参考方案3】:

你可以试试这样的:

  select *
  from a 
  left join b ON <Joining Condition>
  left join c ON <Joining Condition>
  where paramB <> '' or paramC <> ''

【讨论】:

由于paramBparamCwhere 子句中使用,这实际上表现为内连接。

以上是关于根据条件选择加入表的主要内容,如果未能解决你的问题,请参考以下文章

MySQL根据条件多次加入

Hive 在条件之间加入

EF Core/SQL 根据条件加入不同的实体

HeidiSQL 根据两个条件从两个表中选择列

休眠条件:在没有映射关联的情况下加入表

连接两个表而不根据连接条件过滤数据