如何在没有重复的情况下连接两个表,或者使用PLSQL在postgresql中连接第二个表中的单元格

时间:2015-08-12 19:20:42

标签: postgresql join inner-join plpgsql

当我尝试加入以下两个表时 我无法通过连接获得我想要的输出。 我尝试使用join但它没有工作让我知道它是否可能与plsql

Table 1:          
col1 col2          
1    a                    
1    b                 
1    c                    
2    a                    
2    b                    
3    a                    

table 2:

col1  col2

1     x 

1     y

2     x

2     y

3     x

3     y

输出必须是:

col1 col2 col3

1      a    x

1      b    y

1      c    

2      a    x

2      b    y

3      a    x

3           y    

如果使用连接,我无法获得与上面相同的输出。 我得到的输出是

1  a x

1  a y

1  b x

1  b y

1  c x 

1  c y

2  a x

.....
.....

3  a x

3  a y

2 个答案:

答案 0 :(得分:1)

您正在搜索的内容称为FULL OUTER JOIN。此连接的结果包含来自两个输入表的元素,匹配的记录被合并。

您可以找到更多信息here: https://stackoverflow.com/questions/4796872/full-outer-join-in-mysql

答案 1 :(得分:0)

使用Window函数,特别是ROW_NUMBER()并在两个表中按Col1进行分区,我们可以得到一个可用作连接一部分的分区row_number。

换句话说,在我看来,记录所在的顺序对于您希望的连接和结果集至关重要。此外,使用@ Benvorth建议的FULL OUTER JOIN来实现两个方向的NULL ..我相信这可能有用:

SELECT
    COALESCE(t1.col1,t2.col1) as col1,
    t1.col2,
    t2.col2
FROM
    (SELECT col1, col2, ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2 ASC) as col1_row_number FROM table1) t1
    FULL OUTER JOIN
    (SELECT col1, col2, ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2 ASC) as col1_row_number FROM table2) t2 ON
        t1.col1 = t2.col1 AND
        t1.col1_row_number = t2.col1_row_number

ROW_NUMBER() OVER (PARTITION BY col1, ORDER BY col2 ASC)位将为每条记录创建行号。对于遇到的每个新col1值,row_number将重新返回1。根据Col2的值,您可以将其视为每个不同Col1值的RANK。表1的子查询SELECT col1, col2, ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2 ASC) as col1_row_number FROM table1的输出如下所示:

Table 1:          
col1 col2 col1_row_number        
1    a     1               
1    b     2            
1    c     3               
2    a     1               
2    b     2               
3    a     1

因此我们对两个表都这样做,然后我们将该行号与col1一起用作连接的一部分。

sqlfiddle显示符合问题的所需结果