2012-04-27 89 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