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

我有 3 张桌子

  1. 表A
  2. 表B
  3. 表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 语句怎么样?还是您希望在单个查询中进行此操作?

标签: sql-server join


【解决方案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 子句中使用,这实际上表现为内连接。
    猜你喜欢
    • 1970-01-01
    • 2013-03-24
    • 2019-03-19
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    相关资源
    最近更新 更多