2011-08-24 111 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'(帶有表別名)將不被支持。謝謝! –