sql-server - 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 指定的每个新值的行数。在这种情况下,PARTITION BY 和 ORDER BY 是相同的字段,但它们不一定是。将这一切放在一个公共表表达式中,然后允许您进行自联接(在本例中为外部自联接)以获取具有两封电子邮件的用户(其中 rn 将是 1 和 2)和那些只有一。连接的左侧包含 rn 为 1 的那些(将是所有用户),而右侧则选择 2。
希望这可以帮助
乔纳森
推荐阅读
- opengl - 在OpenGL中保存旋转矩阵
- azure - 使用 Terraform 创建 Azure Synapse 池时出错
- php - 如何将付款从一个 PayPal 企业账户发送到另一个?
- php - 使用 SQL 在 Woocommerce 中获取具有特定属性术语和特定类别术语的产品
- php - Twilio 聚集延迟
- sql - 将 For Xml 和 With 子句的结果分配给变量
- java - 如何处理嵌入的复合键?
- c++ - LLVM - 在每个循环中检测一个函数并将所有局部变量传递给它
- node.js - socket.io-client on('message') 不工作
- c++ - 这个 CPython 代码中的“&&x”是什么意思?