【发布时间】:2022-01-08 10:29:59
【问题描述】:
我正在尝试在以下情况下创建查询。
凭借我的技能,我能够单独加入表 A、A1、B 和 A、A1、C 和 A、A1、D 并将它们合并。
有没有更好的方法来达到同样的效果。我使用 Oracle 作为数据库。
【问题讨论】:
标签: sql oracle performance oracle11g oracle-sqldeveloper
我正在尝试在以下情况下创建查询。
凭借我的技能,我能够单独加入表 A、A1、B 和 A、A1、C 和 A、A1、D 并将它们合并。
有没有更好的方法来达到同样的效果。我使用 Oracle 作为数据库。
【问题讨论】:
标签: sql oracle performance oracle11g oracle-sqldeveloper
这完全取决于它们的含义以及您是否需要知道这些值来自哪些列。
这将获取所有列,并且您将从不匹配的 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
【讨论】:
当我读到你的问题时,我首先想到的是联合。不过,为简单起见,您可以先创建一个视图,然后将其连接到其他表:
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;
【讨论】:
您可以尝试使用“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;
【讨论】:
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
【讨论】: