首页 > 解决方案 > SQL Server:查询单个表以显示其他列

问题描述

我正在处理一张桌子,需要获得带有附加列的特定输出。在表格的第一列中,我有用户名,第二列有电子邮件地址。用户可以有一个或两个电子邮件地址。所以第一列会有重复的值。我需要使用包含三列的 SQL 查询返回表上的数据:用户名、第一个电子邮件地址和第二个电子邮件地址。

请问可以帮忙查询吗?

例子:

| username1 | email1@test.com |
| username1 | email2@test.com | 

输出:

| username1 | email1@test.com | email2@test.com | 

标签: sql-server

解决方案


首先欢迎来到 Stackoverflow。

假设您至少使用 SQL Server 2008,您可以使用 row_number() 和自连接来实现此目的

为了说明这是如何工作的,我举一个简单的例子:

declare @test table(username varchar(50), email  varchar(50))

insert INTO @test values('username1', 'email1@test.com')
insert INTO @test values('username1', 'email2@test.com')
insert INTO @test values('username2', 'email3@test.com')


;with cte as
(SELECT username, email, row_number() OVER (PARTITION BY username order by username) rn
from @test)
SELECT t1.username, t1.email as email1, t2.email as email2
FROM cte t1
LEFT JOIN cte t2 ON t1.username = t2.username AND t2.rn = 2
WHERE t1.rn = 1

作为解释,row_number() 为每一行提供一个唯一编号,由 OVER 中的 ORDER BY 确定。添加 PARTITION BY 会重置 PARTITION 指定的每个新值的行数。在这种情况下,PARTITION BY 和 ORDER BY 是相同的字段,但它们不一定是。将这一切放在一个公共表表达式中,然后允许您进行自联接(在本例中为外部自联接)以获取具有两封电子邮件的用户(其中​​ rn 将是 1 和 2)和那些只有一。连接的左侧包含 rn 为 1 的那些(将是所有用户),而右侧则选择 2。

希望这可以帮助

乔纳森


推荐阅读