2012-04-27 24 views
3

對於這個兩個表:平加入兩個表

CREATE TABLE TEST1 (ID INTEGER ,key VARCHAR(50),VALUE1 VARCHAR(50)); 
CREATE TABLE TEST2 (ID INTEGER ,key VARCHAR(50),VALUE2 VARCHAR(50)); 

表1:

130, 'HANSEN', 'STREET1' 
130, 'HANSEN', 'STREET2' 
130, 'HANSEN', 'STREET3' 
120, 'HANSEN', 'STREET5' 
120, 'HANSEN', 'STREET6' 

表2:

130, 'HANSEN', 'ZIP1' 
130, 'HANSEN', 'ZIP2' 
130, 'HANSEN', 'ZIP3' 
120, 'HANSEN', 'ZIP4' 
120, 'HANSEN', 'ZIP5' 

是否有可能得到的輸出爲:

130, 'HANSEN', 'ZIP1','STREET1' 
130, 'HANSEN', 'ZIP2','STREET2' 
130, 'HANSEN', 'ZIP3','STREET3' 
120, 'HANSEN', 'ZIP4','STREET5' 
120, 'HANSEN', 'ZIP5','STREET6' 

嘗試與內部連接ID,密鑰,但我得到笛卡爾產品
感謝您的幫助。

輔助腳本(如果有人願意對其進行測試):

DROP TABLE TEST1; 
DROP TABLE TEST2; 

CREATE TABLE TEST1 (ID INTEGER ,key VARCHAR(50),VALUE1 VARCHAR(50)); 
CREATE TABLE TEST2 (ID INTEGER ,key VARCHAR(50),VALUE2 VARCHAR(50)); 

INSERT INTO TEST1 VALUES (130, 'HANSEN', 'STREET1'); 
INSERT INTO TEST1 VALUES (130, 'HANSEN', 'STREET2'); 
INSERT INTO TEST1 VALUES (130, 'HANSEN', 'STREET3'); 
INSERT INTO TEST1 VALUES (120, 'HANSEN', 'STREET5'); 
INSERT INTO TEST1 VALUES (120, 'HANSEN', 'STREET6'); 

INSERT INTO TEST2 VALUES (130, 'HANSEN', 'ZIP1'); 
INSERT INTO TEST2 VALUES (130, 'HANSEN', 'ZIP2'); 
INSERT INTO TEST2 VALUES (130, 'HANSEN', 'ZIP3'); 
INSERT INTO TEST2 VALUES (120, 'HANSEN', 'ZIP4'); 
INSERT INTO TEST2 VALUES (120, 'HANSEN', 'ZIP5'); 
+0

什麼是你的數據庫? – 2012-04-27 22:17:02

+0

@ Vash:不,它不是笛卡爾連接。顯然OP需要加入行號。這可能會完成,具體取決於RDBMS。 – 2012-04-27 22:17:29

+0

@Vash:期望的輸出不是笛卡爾式加入 – user648026 2012-04-27 22:17:48

回答

1

輸出這應做到最好:

with t1 as (
    select id, 
      key, 
      value1, 
      row_number() over (partition by id order by key, value1) as rn 
    from test1 
), 
t2 as (
    select id, 
      key, 
      value2, 
      row_number() over (partition by id order by key, value2) as rn 
    from test2 
) 
select t1.id, 
     t2.key, 
     t2.value2||','||t1.value1 
from t1 
    join t2 on t1.id = t2.id and t1.key = t2.key and t1.rn = t2.rn 
order by 1 desc, 3 asc 
+0

謝謝!這是工作 – user648026 2012-04-30 14:14:56

+0

工作 - 但不建議大量的數據... – user648026 2012-04-30 22:22:03

+0

@ user648026:告訴我們解釋計劃。表中定義了哪些索引? – 2012-04-30 22:23:26

1

它不漂亮,並根據甲骨文給你的結果集的順序,你可能會得到奇怪的結果,但你可以嘗試:

select t1.id, t1.key, t1.value1, t2.value2 
    from 
    (select rownum rn, id, key, value1 from test1) t1 
      inner join 
    (select rownum rn, id, key, value2 from test2) t2 
      using (rn) 

如果您需要按照您的建議「合併」這兩個表格,我會嘗試添加一些「合併」列來執行此操作,而不使用此方法。

+1

@ user648026:哦,是的!確實很危險。 – 2012-04-27 22:39:57

0

沒有..沒有辦法可靠地得到你想要的輸出。

它看起來像你的datamodel缺少一些信息。即某種方式將測試1中的行鏈接到測試2 ..您目前擁有的ID /密鑰不夠獨特。

我認爲你可以做,因爲它代表將

select * 
from test1 
inner join test2 using (id,key) 
order by 1 desc,2,3,4 

賦予的

130 HANSEN STREET1 ZIP1 
130 HANSEN STREET1 ZIP2 
130 HANSEN STREET1 ZIP3 
130 HANSEN STREET2 ZIP1 
130 HANSEN STREET2 ZIP2 
130 HANSEN STREET2 ZIP3 
130 HANSEN STREET3 ZIP1 
130 HANSEN STREET3 ZIP2 
130 HANSEN STREET3 ZIP3 
120 HANSEN STREET5 ZIP4 
120 HANSEN STREET5 ZIP5 
120 HANSEN STREET6 ZIP4 
120 HANSEN STREET6 ZIP5