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

时间:2019-02-01 11:53:41

标签: sql-server

我正在处理一个表,需要获取带有其他列的特定输出。 在表格的第一列中,我有用户名,第二列中有电子邮件地址。用户可以拥有一个或两个电子邮件地址。因此第一列将具有重复的值。我需要使用带有三列的SQL查询返回表上的数据:用户名,第一个电子邮件地址和第二个电子邮件地址。

请协助查询吗?

示例:

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

输出:

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

1 个答案:

答案 0 :(得分:0)

首先欢迎您使用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(这将是所有用户),而右侧拾取2S。

希望这会有所帮助

乔纳森