sql - 合并、组合、合并行

标签 sql postgresql join duplicates full-outer-join

我所做的每一次搜索都会让我找到寻找 array_agg 以将一行中的多个列组合成列的人的结果。这不是我在这里想要弄清楚的,也许我没有使用正确的搜索词(例如,合并、合并、合并)。

我正在尝试通过在字段中填充值来组合行...除了示例之外,我不确定描述此问题的最佳方式:

Current:
--------------------------------
 id  num_1  num_2  num_3  num_4 
--------------------------------
 1    111    222     0      0   
 2    111    333     0      0   
 3    111     0      0     444  
 4     0     222    555     0   
 5    777    999     0      0   
 6     0     999    888     0   

After Processing:
--------------------------------
 id  num_1  num_2  num_3  num_4 
--------------------------------
 1    111    222    555    444  
 2    111    333    555    444  
 3    111    333    555    444  
 4    111    222    555    444  
 5    777    999    888     0   
 6    777    999    888     0   


After Deleting Duplicate Rows:
--------------------------------
 id  num_1  num_2  num_3  num_4 
--------------------------------
 1    111    222    555    444  
 2    111    333    555    444  
 3    777    999    888     0   

这可能是一个两步过程……首先填写空白,然后查找/删除重复项。我可以执行第二步,但无法弄清楚如何首先使用另一行中的值填充 0 值,您可能有两个不同的值(num_2 列的 id 1/2)但只有一个值对于 num_1(例如 111)

我可以用 PHP 完成,但想知道如何只使用 Postgres 来完成。

编辑:我的示例表是一个关系表。我有多个具有相似信息(例如用户名)但注册 ID 号不同的数据集。因此,我在用户名相同的表 1 和表 2(例如)上进行了内部联接。然后我从每个表中获取注册 ID(不同的)并将其作为一行插入到我的关系表中。在我上面的示例表中,第 1 行有两个不同的注册 ID 来 self 加入的两个表......值 111 (num_1) 和 222 (num_2) 被插入到表中以及为 num_3num_4 插入的零。然后我比较表 1 和表 4,值 111 (num_1) 和 444 (num_4) 被插入到关系表中,并且 num_2 为零> 和 num_3。由于注册 ID 111 与注册 ID 222 相关,而注册 ID 111 与注册 ID 444 相关,因此注册 ID 111、222 和 444 都是相关的(这意味着每个注册 ID 的用户名都相同)。这有助于澄清吗?

编辑 2: 我更正了表 2 和表 3。希望现在它有意义了。用户名列不是唯一的。所以,我有 4 个这样的表:

表 1:

bob  - 111
mary - 777

表 2:

bob  - 222
bob  - 333
mary - 999

表 3:

bob  - 555
mary - 888

表 4:

bob  - 444  -- mary does not exist in this table

因此,在我的关系表中,我应该以上面示例表 3 中给出的 3 行结束。

最佳答案

您似乎是从假定的解决方案中间开始的,忘记了提出最初的问题。根据您添加的信息,我建议一个完全不同的、更简单的解决方案。你有:

CREATE TABLE table1 (username text, registration_id int);
CREATE TABLE table2 (LIKE table1);
CREATE TABLE table3 (LIKE table1);
CREATE TABLE table4 (LIKE table1);

INSERT INTO table1 VALUES ('bob', 111), ('mary', 777);
INSERT INTO table2 VALUES ('bob', 222), ('bob', 333), ('mary', 999);
INSERT INTO table3 VALUES ('bob', 555), ('mary', 888);
INSERT INTO table4 VALUES ('bob', 444); -- no mary

解决方案

真正似乎需要的是FULL [OUTER] JOIN。手册中的详细信息 FROMJOIN .

-- CREATE TABLE relations AS
SELECT username
     , t1.registration_id AS reg1
     , t2.registration_id AS reg2
     , t3.registration_id AS reg3
     , t4.registration_id AS reg4
FROM   table1     t1
FULL   JOIN table2 t2 USING (username)
FULL   JOIN table3 t3 USING (username)
FULL   JOIN table4 t4 USING (username)
ORDER  BY username;

就是这样。直接产生您想要的结果。

username  reg1  reg2  reg3  reg4
---------------------------------
bob       111   222   555   444
bob       111   333   555   444
mary      777   999   888   (null)

您给出的示例也适用于 LEFT JOIN,因为所有缺失的条目都在右侧。但这在其他星座中会失败。我在 fiddle 中添加了一些更具启发性的测试用例:

SQL Fiddle.

我假设您知道多个表中的多个条目会产生大量输出行:

关于sql - 合并、组合、合并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34830693/

相关文章:

php - 使用 PHP 进行 MySQL 查询时不显示结果

mysql - 分配的查询变量无法识别

php - 如何检查在 ON DUPLICATE 语句中更新和插入了多少行?

postgresql - 如何将两个查询放在一起?

r - 模糊 LEFT 与 R 连接

sql - PostgreSQL 中的类别代码是什么?

sql - generate_series 用于创建月份列表以获取缺失日期

reactjs - 等待所有的 promise 成功

php连接3个表然后插入到第4个表

mysql - 一对多加入但只有第一行