当我尝试加入以下两个表时 我无法通过连接获得我想要的输出。 我尝试使用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
答案 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显示符合问题的所需结果