Sql 从多个表有条件地联接

Sql 从多个表有条件地联接,sql,oracle,join,case,Sql,Oracle,Join,Case,SQL是否允许在Join语句中使用某种形式的条件“表选择”?即,根据预定义的变量/条件选择要联接的不同表 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,否则SQL和Oracle都不允许这样做 假设表

SQL是否允许在Join语句中使用某种形式的条件“表选择”?即,根据预定义的变量/条件选择要联接的不同表

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,否则SQL和Oracle都不允许这样做

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

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;

您仍然需要提前指定所有联接,它们必须是外部联接,但您可以像这样重写语句。无论每个表中有多少字段(union的要求),这种方法都会起作用,如果它们的名称不同,则可以按名称访问相应的字段

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