有条件地从多个表中联接数据

3
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: missing keyword
2个回答

6
不行。除非使用动态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;

0
你仍需要提前指定所有联接并且它们必须是左外联接,但你可以像这样重写语句。这种方式将适用于每个表中字段的数量(对于 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接