如何将一个表与每个 id 的两条记录连接起来?

Posted

技术标签:

【中文标题】如何将一个表与每个 id 的两条记录连接起来?【英文标题】:How to join a table with itself with two records per id? 【发布时间】:2021-06-04 14:28:05 【问题描述】:

所以,我有一个结构如下的表:

id columnA columnB
1 Yes
1 No

我想将该行合并为一行,所以它最终是这样的:

id columnA columnB
1 Yes No

我相信这里的自我加入会像这样工作:

SELECT t1.columnA , t2.columnB 
FROM table1 t1, table1 t2
where t1.id = t2.id

但是有没有办法在不指定列的情况下做到这一点?我有一个包含 100 列的表,我正在尝试查看是否可以在不列出所有列的情况下完成此操作。

【问题讨论】:

Postgres 和 Redshift 是不同的数据库。请仅使用您真正使用的数据库进行标记。 添加更多示例数据。 Id 只有 1 个或 3 个不同的值,等等 【参考方案1】:

使用以下查询通过聚合获取列名(使用信息架构创建的查询以获取列名)。使用结果编写一个选择并运行查询。

select 
case when column_name='Id' then column_name
else concat(',Max(', column_name,')') end as Name 
from information_schema.columns 
where table_name = 'Table1';

您将得到如下所示的输出,其中 A 和 B 是列名。

Id
,Max(A)
,Max(B)

添加转换结果到查询

Select 
Id
,Max(A)
,Max(B) 
from Table1 Group by Id

【讨论】:

【参考方案2】:

有没有办法在不指定列的情况下做到这一点?

您可以使用using 回答您的问题。

SELECT t1.columnA , t2.columnB 
FROM table1 t1 JOIN
     table1 t2
     USING (id);

要获取您想要的数据,请使用聚合:

SELECT id, MAX(t1.columnA), MAX(t2.columnB)
FROM table1 t1 
GROUP BY id;

【讨论】:

如果我想保留几列怎么办?我必须在我的选择语句中指定所有这些吗? 您必须提及所有列,以免 SGBD 与相同名称混淆。您可以获得一个简单的查询,选择表的前 1000 行,然后您将拥有所有已写入的名称。然后,您只需为要保留的任何列添加 T1 或 T2【参考方案3】:

使用您的 JOIN 仅更改 * 的列

SELECT t1.*, t2.*
FROM table1 t1, table1 t2
where t1.id = t2.id

【讨论】:

以上是关于如何将一个表与每个 id 的两条记录连接起来?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 如何将一个表中的两条或多条拥有相同ID的记录合并为一条?

如何将Mysql中的表与空表连接起来

两个表进行左连接(LEFT JOIN ) 如何只显示右表中为空值的记录行,左表与右表存在关联的记录不显示。

如何在 LINQ sql 中将两个表与一个具有不同值的表连接起来?

如何将一个表与另一个表中的一系列值连接起来?

如何基于每个数据框中具有不同名称的两列将两个数据框与 dplyr 连接起来? [复制]