首页 > 解决方案 > 多行问题

问题描述

我有一个查询,我将一个表连接到另一个存储电子邮件地址的表。所以查询可能会:

SELECT RT.name, RT.address, ET.email
FROM Reference_Table as RT
     LEFT OUTER JOIN Email_Table as ET ON RT.field = ET.field
WHERE ...

但是,每个人可以存储多个电子邮件地址,这可以给我这个输出:

Name            Address                       Email
John Smith    1, The Street               js@x.com
John Smith    1, The Street               js1@y.com

我想要的输出是:

Name            Address                       Email 1         Email 2
John Smith    1, The Street               js@x.com       js1@y.com

例如,所有东西都放在一排,而不是两排。

请你能建议实现这一目标的最简单方法(如果它很简单)?

我之前尝试过一两件事——当只有一张桌子时可以工作——但无法找到解决上述问题的简单方法。谢谢。

标签: sqlsql-servertsql

解决方案


如果您可以将电子邮件地址限制为固定数字,您可以使用 CTE,在该 CTE 中,您使用每个名称/地址为每个电子邮件地址分配数字row_number(),然后将其加入,包括ON条件中的数字。

WITH cte
AS
(
SELECT et.email,
       et.field,
       row_number() OVER (PARTITION BY et.field
                          ORDER BY et.email) rn
       FROM email_table et
)
SELECT rt.name,
       rt.address,
       cte1.email email1,
       cte2.email email2
       FROM reference_table rt
            LEFT JOIN cte cte1
                      ON cte1.field = rt.field
                         AND cte1.rn = 1
            LEFT JOIN cte cte2
                      ON cte2.field = rt.field
                         AND cte2.rn = 2
       WHERE ...;

如果有另一列email_table定义了电子邮件地址的顺序,您可能希望将该列用于ORDER BY子句的OVER子句。相应地改变它。


推荐阅读