2011-08-24 102 views
1

我有2个表SQL合并多个行到

表A

A1 | A2 
1 | 2 
2 | 3 
3 | 4 

表B

B1 | B2 
1 | 3 
1 | 5 
4 | 3 

A1,A2,B1和B2都是ID的

我只有当A.A1 = B.B1时,才想将表A与表B连接起来。

Select A.A1, A.A2, B.B2 from A JOIN B ON A.A1 = B.B1 

应该返回

A1 | A2 | B2 
1 | 2 | 3 
1 | 2 | 5 

但我想以这种形式获得的数据,我想最终结果为:

A1 | Col2 
1 | 2 
1 | 3 
1 | 5 

额外的问题:我怎么能知道从哪个列信息来?

A1 | Col2 | Table 
1 | 2 | A 
1 | 3 | B 
1 | 5 | B 

Thx寻求帮助。编辑1:联盟不会工作,我不想堆叠两个表中的字段,我想要在一个条件下联接数据,但由于A2和B2是同一类型的ID,我想有一个数据在一个条件单一的柱子,它会简化未来对结果的查询。

+0

请说明你为什么要这样了,请回去**接受一些回答您的问题过去** – JNK

+0

我没有忘记他们,需要真的要支持他们,在更近的一个投票,并告诉我的解决方案 – blueomega

回答

2

为了呈现多个表作为一个表,你使用UNION

SELECT A1 as Col1, A2 as Col2, 'A' as Col3 FROM table_A 
UNION ALL 
SELECT B1 as Col1, B2 as Col2, 'B' as Col3 FROM table_B 

根据修订问题,又多了一个where条件提供你正在寻找的结果。根据所提供的场景,我仍然没有看到任何需要加入的理由。

SELECT * FROM 
    (SELECT A1, A2 as Col2, 'A' as "TABLE" FROM table_A 
    UNION ALL 
    SELECT B1, B2 as Col2, 'B' as "TABLE" FROM table_B) 
WHERE A1 = 1; 
+0

不是他以后我不认为。 – JNK

+0

@JNK:他希望表A中的4列和表B中的4列在结果集中显示为8列,理想情况下在知道每行起始于哪个表中。我没有看到问题中的任何内容导致我相信这不是OP正在寻找的解决方案。 – Allan

+0

你确定你正在寻找正确的问题吗?他希望来自A的两个字段和来自B的两个字段合并成具有2个字段的单个结果集,但是从3个字段标准化。 – JNK

0

不是很清楚你的问题是,但你想要的可能是这个。

CREATE TABLE a(a1 INT, a2 INT); 
CREATE TABLE b(b1 INT, b2 INT); 

INSERT INTO a VALUES(1, 2); 
INSERT INTO a VALUES(2, 3); 
INSERT INTO a VALUES(3, 4); 

INSERT INTO b VALUES(1, 3); 
INSERT INTO b VALUES(1, 5); 
INSERT INTO b VALUES(4, 3); 

COMMIT; 

SELECT a1 AS "1", a2 AS "2", 'A' AS "src" FROM a 
UNION 
SELECT a1, b2, 'B' FROM a, b WHERE a1 = b1; 

1      2      src 
---------------------- ---------------------- --- 
1      2      A 
1      3      B 
1      5      B 
2      3      A 
3      4      A 
0

这样的事情,可能是:

SELECT 
    u.* 
FROM (
    SELECT A1, B1 AS Col2, 'A' AS SourceTable FROM A 
    UNION ALL 
    SELECT B1, B2 AS Col2, 'B' AS SourceTable FROM B 
) u 
    INNER JOIN (
    SELECT A1 FROM A 
    INTERSECT 
    SELECT B1 FROM B 
) i ON u.A1 = i.A1 
+0

我想你需要在'AS u'和'AS i'中删除两个'AS',否则它不会运行。 –

+0

完成。对Oracle知之甚少,我不得不查看它是否支持'INTERSECT',但我无法想象'AS'(带有表别名)将不被支持。谢谢! –