2010-03-02 134 views
31

我有两个具有类似信息的表。我们称它们为items_aitems_b。它们应该是一个,但它们来自不同的来源,所以它们不是。当我完全连接这两个表时,一些行最终会来自一个或两个表的数据。两个表中的一列是category_id。我想用category_id与类别表交叉。但是,我现在有两个category_id列(一个从items_a和一个从items_b)。有没有办法将两列合并为一个?如何将两个表中的列合并为一个输出?

我希望这不是太混乱的一个问题。

回答

33

指定您的查询的列应该做的伎俩:

select a.col1, b.col2, a.col3, b.col4, a.category_id 
from items_a a, items_b b 
where a.category_id = b.category_id 

应该做的伎俩至于挑选您想要的列。

要解决的是,有些数据只在items_a,有些数据只在items_b,你就能够做到:

select 
    coalesce(a.col1, b.col1) as col1, 
    coalesce(a.col2, b.col2) as col2, 
    coalesce(a.col3, b.col3) as col3, 
    a.category_id 
from items_a a, items_b b 
where a.category_id = b.category_id 

聚结函数将返回第一个非空值,所以对于每一行如果col1非空,它会使用它,否则它会从col2得到值,等等。

+0

可我还用它在如: ...其中c.col1 = COALESCE( a.col1,b.col1) ? – burger 2010-03-02 04:30:39

+0

@bigmac:不应该是个问题 – beny23 2010-03-02 13:00:20

+1

如果没有共同的ID,该怎么办?我只是希望列没有共同的ID,只是他们出现的顺序彼此加入? – CMCDragonkai 2015-02-09 06:49:56

21

我想你想要做的是both tablesUNION

如果两个表具有相同的列,那么你可以做

SELECT category_id, col1, col2, col3 
    FROM items_a 
UNION 
SELECT category_id, col1, col2, col3 
    FROM items_b 

否则,你可能需要做一些像

SELECT category_id, col1, col2, col3 
    FROM items_a 
UNION 
SELECT category_id, col_1 as col1, col_2 as col2, col_3 as col3 
    FROM items_b 
+0

你的第一个例子不是有效的'UNION'语句 - 它应该是两个SELECT语句的组合。第二个示例不需要括号,并且在语法上是正确的。 – 2010-03-02 02:55:54

-2

我有一个小的差异有类似的问题:一些a.category_id不在b中,而某些b.category_id不在a中。
为了解决这个问题,刚刚从beny23的外观极好答案适应

 
select a.col1, b.col2, a.col3, b.col4, a.category_id 
from items_a a 
LEFT OUTER JOIN 
items_b b 
on a.category_id = b.category_id 

希望这可以帮助别人。
此致敬礼。

-1
SELECT col1, 
    col2 
FROM 
    (SELECT rownum X,col_table1 FROM table1) T1 
INNER JOIN 
    (SELECT rownum Y, col_table2 FROM table2) T2 
ON T1.X=T2.Y; 
+2

很难将其解读为原始问题的答案。虽然这个概念可能确实是对的,但它需要一些解释来展示它与问题的关系。 – Blackwood 2015-08-21 01:17:23

+0

这个答案确实帮助我将两个不同表中的两列结合起来,并在单个查询中将它们显示为两个不同的列。 – 2018-01-29 22:30:23

-2

当你的三个表以上,只需添加联盟和左外连接:

select a.col1, b.col2, a.col3, b.col4, a.category_id 
from 
(
    select category_id from a 
    union 
    select category_id from b 
) as c 
left outer join a on a.category_id = c.category_id 
left outer join b on b.category_id = c.category_id