我有几个表,每个表包含不同的列,其中包含所有产品的不同子集。
我想获得有关所有产品的所有信息的列表,因此我想在full outer join
上进行product_id
。
我试过
select * from table1
full outer join table2 b on b.product_id = table1.product_id
...
full outer join tableN c on b.product_id = table1.product_id
但这导致多行,其中table1中不存在product_id
,但可能存在于table2和tableN中。
有没有办法“合并”连接列?
答案 0 :(得分:2)
如果你使用full outer join
超过两个表,那么你最终会得到这样的结果:
select *
from table1 a full outer join
table2 b
on b.product_id = a.product_id
... full outer join
tableN c
on c.product_id = coalesce(b.product_id, a.product_id)
using
子句 - 由Postgres支持但不支持SQL Server - 简化了这一点。它确实假设列都具有相同的名称。
另一种选择是驾驶表。如果您没有方便的所有产品表,您可以创建一个:
select *
from (select product_id from table1 union
select product_id from table2 union
. . .
select product_id from tableN
) driving left join
table1 a
on a.product_id = driving.product_id left join
table2 b
on b.product_id = driving.product_id
... full outer join
tableN c
on c.product_id = driving.product_id;
这应该更容易解释,并且on
条款得到简化。
最后,也许您只想要常见的列。如果是这样,请使用union all
:
select product_id, col1, col2, col3 from table1 union all
select product_id, col1, col2, col3 from table2 union all
. . .
select product_id, col1, col2, col3 from tableN;
这可以防止NULL
值列的扩散。
答案 1 :(得分:0)
select * from table1
inner join
(
SELECT * FROM table2
UNION ALL
SELECT * FROM table3
UNION ALL ........
SELECT * FROM tableN
) N
on N.product_id = table1.product_id