如何使用 PSQL 在 postgresql 中加入两个 table 而不重复来自第二个 table 的单元格
how to join two tables without repetation or the cells from second table in postgresql using PLSQL
当我尝试加入以下两个时 table
我无法通过联接获得所需的输出。
我尝试使用 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
您正在搜索的是 FULL OUTER JOIN
。此连接的结果包含来自两个输入表的元素,匹配的记录被合并。
您可以找到更多信息
使用 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 一起用作连接的一部分。
A sqlfiddle 显示此匹配问题的所需结果
当我尝试加入以下两个时 table 我无法通过联接获得所需的输出。 我尝试使用 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
您正在搜索的是 FULL OUTER JOIN
。此连接的结果包含来自两个输入表的元素,匹配的记录被合并。
您可以找到更多信息
使用 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 一起用作连接的一部分。
A sqlfiddle 显示此匹配问题的所需结果