SQL Server:查询单个表以显示其他列



我正在处理一个表,需要获得带有其他列的特定输出。在表的第一列中,我有用户名,第二列有电子邮件地址。用户可以有一个或两个电子邮件地址。因此,第一列将具有重复值。我需要使用具有三列的 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。

希望这有帮助

乔纳森

最新更新