【问题标题】:Conditionally joining from multiple tables从多个表有条件地加入
【发布时间】:2020-03-30 20:34:48
【问题描述】:

SQL 是否允许在 Join 语句中进行某种形式的条件“表选择”? IE。根据预定义的变量/条件选择要加入的不同表。

define var = 1
select * 
from tbl
  join (case when &var=1 then tblA when &var=2 then tblB else tblC end) a on tbl.id = a.id

我在尝试此方法时遇到的错误是ORA-00905:缺少关键字

【问题讨论】:

    标签: sql oracle join case


    【解决方案1】:

    没有。 SQL 和 Oracle 都不允许这样做,除非您使用动态 SQL。

    假设表具有相同的列,您可以将此逻辑编写为:

    select * 
    from tbl join
         (select a.* from tblA where &var = 1 union all
          select b.* from tblB where &var = 2 union all
          select c.* from tblC where &var not in (1, 2)
         ) abc
         on tbl.id = abc.id;
    

    【讨论】:

      【解决方案2】:

      您仍然需要提前指定所有联接,并且它们必须是左外部联接,但是您可以像这样重写您的语句。无论每个表中的字段数量如何(联合的要求),这种方式都可以使用,如果它们的名称不同,那么您可以按名称访问相应的字段。

      DECLARE @var int
      SET @var=1
      
      select tbl.*, tblA.ShippingName, tblB.BillingName, tblC.OtherName 
      from tbl
        left outer join tblA on tbl.id = tblA.id and @var = 1
        left outer join tblB on tbl.id = tblB.id and @var = 2
        left outer join tblC on tbl.id = tblC.id and @var = 3
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-22
        • 2013-08-03
        • 2014-12-10
        相关资源
        最近更新 更多