我正在处理一个表,需要获得带有其他列的特定输出。在表的第一列中,我有用户名,第二列有电子邮件地址。用户可以有一个或两个电子邮件地址。因此,第一列将具有重复值。我需要使用具有三列的 SQL 查询返回表上的数据:用户名、第一个电子邮件地址和第二个电子邮件地址。
可以协助查询吗?
例:
| username1 | email1@test.com |
| username1 | email2@test.com |
输出:
| username1 | email1@test.com | email2@test.com |
首先欢迎来到 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 BY 和 ORDER BY 是同一个字段,但它们不一定是。 将所有这些放在一个公共表表达式中,然后允许您执行自连接(在本例中为外部自连接),以选取具有两封电子邮件(其中 rn 将是 1 和 2)的用户和只有一封电子邮件的用户。 联接的左侧包含 rn 为 1 的用户(将是所有用户),而右侧则拾取 2。
希望这有帮助
乔纳森