加入几个列中的任意一列

时间:2016-11-16 21:31:18

标签: sql

我有几个表,每个表包含不同的列,其中包含所有产品的不同子集。 我想获得有关所有产品的所有信息的列表,因此我想在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中。 有没有办法“合并”连接列?

2 个答案:

答案 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