sql - 多行问题
问题描述
我有一个查询,我将一个表连接到另一个存储电子邮件地址的表。所以查询可能会:
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
例如,所有东西都放在一排,而不是两排。
请你能建议实现这一目标的最简单方法(如果它很简单)?
我之前尝试过一两件事——当只有一张桌子时可以工作——但无法找到解决上述问题的简单方法。谢谢。
解决方案
如果您可以将电子邮件地址限制为固定数字,您可以使用 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
子句。相应地改变它。
推荐阅读
- python - Python:对于每个唯一 ID,找到其代码及其值并计算比率
- git - 在 Mac 上:git push 导致“请求的 URL 返回错误:403”
- java - 使用 Simple Spring Memcached 使整个命名空间无效
- mongodb - 查找:字段值包含在给定文本中
- python - 如何循环并用列中的特定值替换下一行的值
- google-chrome - 如何确定 Chrome 80 阻止了哪些 cookie
- node.js - 如何迭代对象数组或将对象列表转换为数组?
- c++ - 从基类指针列表中获取特定派生类对象的良好设计模式是什么?
- reactjs - React 中 useMemo 的用例是什么?
- r - 更改 hexbinplot 中轴注释的字体大小