多个 table 通过单列连接到 table
Multiple tables joined to a table via single column
我正在尝试在以下情况下创建查询。
凭借我的技能,我能够加入 Table A、A1、B 和 A、A1、C 和 A、A1、D 并单独合并它们。
有没有更好的方法来达到同样的效果。我正在使用 Oracle 作为数据库。
当我读到你的问题时,我的第一个想法是联合。不过,为简单起见,您可以先创建一个视图,然后将其加入其他 table(s):
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
这完全取决于它们的含义以及您是否需要知道这些值来自的列。
这将获取所有列,并且您将从不匹配的 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
我正在尝试在以下情况下创建查询。
凭借我的技能,我能够加入 Table A、A1、B 和 A、A1、C 和 A、A1、D 并单独合并它们。
有没有更好的方法来达到同样的效果。我正在使用 Oracle 作为数据库。
当我读到你的问题时,我的第一个想法是联合。不过,为简单起见,您可以先创建一个视图,然后将其加入其他 table(s):
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
这完全取决于它们的含义以及您是否需要知道这些值来自的列。
这将获取所有列,并且您将从不匹配的 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