【问题标题】:Multiple tables joined to a table via single column多个表通过单列连接到一个表
【发布时间】:2022-01-08 10:29:59
【问题描述】:

我正在尝试在以下情况下创建查询。

凭借我的技能,我能够单独加入表 A、A1、B 和 A、A1、C 和 A、A1、D 并将它们合并。

有没有更好的方法来达到同样的效果。我使用 Oracle 作为数据库。

【问题讨论】:

    标签: sql oracle performance oracle11g oracle-sqldeveloper


    【解决方案1】:

    这完全取决于它们的含义以及您是否需要知道这些值来自哪些列。

    这将获取所有列,并且您将从不匹配的 B、C、D 表中获得 NULL 值:

    SELECT *
    FROM   a1
           INNER JOIN a ON a1.aid = a.id
           LEFT OUTER JOIN b ON a.extid = b.extid
           LEFT OUTER JOIN c ON a.extid = c.extid
           LEFT OUTER JOIN d ON a.extid = d.extid
    

    或者,这将只获取相关值并在更少的列中为您提供它们所属的类型:

    SELECT *
    FROM   a1
           INNER JOIN a ON a1.aid = a.id
           INNER JOIN (
             SELECT extid, 'B' AS type, pqr_col AS col1, qrs_col AS col2 FROM b
             UNION ALL
             SELECT extid, 'C', abc_col, bcd_col FROM c
             UNION ALL
             SELECT extid, 'D', xyz_col, yza_col FROM d
           ) bcd
           ON a.extid = bcd.extid
    

    【讨论】:

      【解决方案2】:

      当我读到你的问题时,我首先想到的是联合。不过,为简单起见,您可以先创建一个视图,然后将其连接到其他表:

      create view v_ext as
        select b.extid, b.pqr_col, b.qrs_col from b
        union all
        select c.extid, c.abc_col, c.bcd_col from c
        union all
        select d.extid, d.xyz_col, d.yza_col from d;
        
      select *
      from a join a1 on a.id = a1.aid
             join v_ext v on v.extid = a.extid;
      

      【讨论】:

        【解决方案3】:

        您可以尝试使用“with”子句进行查询。类似下面的东西,不过我还没有测试过

        with union_output as
          ( select b.extid, b.pqr_col, b.qrs_col from b
            union
            select c.extid, c.abc_col, c.bcd_col from c
            union
            select d.extid, d.xyz_col, d.yza_col from d) 
        select *
        from a join a1 on a.id = a1.aid
               join union_output uo on uo.extid = a.extid;
        

        【讨论】:

          【解决方案4】:
          Select *from tableA A
          Inner join tableA1 A1 on A1.A1ID=A.AID 
          Inner join tableB b on b.ExtID=A.ExtID
          Inner join tableC c on c.ExtID=A.ExtID
          Inner join tableD d on d.ExtID=A.ExtID
          

          【讨论】:

            猜你喜欢
            • 2018-12-19
            • 2019-07-11
            • 2021-06-22
            • 1970-01-01
            • 2010-10-20
            • 2011-05-07
            • 2017-06-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多