如何从同表关联行中选取不同字段?SQL实现方案咨询
问题背景
现有通话记录表格如下:
| user | phone | datetime | duration | status | task | callID |
|---|---|---|---|---|---|---|
| Alice | 123 | 2022-08-29 18:59 | 52 | 2 | 111 | 222 |
| Bob | 567 | 2022-08-28 17:43 | 31 | 5 | 333 | 222 |
表中存在两类通话记录,通过不同的task ID区分,关联通话的callID始终相同。需要从task=111的记录中选取部分字段,从task=333的记录中选取另一部分字段,组合生成每组关联记录的结果,伪代码如下:
SELECT A.user, B.phone, A.datetime, A.duration, B.status, A.callID FROM MyTable WHERE A.datetime BETWEEN... AND B.user='Alice'
请问应使用JOIN、MERGE、UNION,还是临时表与自定义存储过程?
解决方案
首选JOIN,这是最直接高效的实现方式,因为需求核心是基于相同callID关联两类记录,横向拼接不同字段。
具体SQL实现示例:
SELECT A.user, B.phone, A.datetime, A.duration, B.status, A.callID FROM MyTable A JOIN MyTable B ON A.callID = B.callID WHERE A.task = 111 AND B.task = 333 AND A.datetime BETWEEN '起始时间' AND '结束时间' AND B.user = 'Alice'
其他方案不适用的原因:
- UNION:用于合并同结构的纵向结果集,无法实现不同记录的字段横向拼接,不符合需求。
- MERGE:主要用于数据同步场景(插入、更新、删除操作),不是关联查询字段的工具。
- 临时表+存储过程:属于冗余方案,简单的关联查询无需额外创建临时表或存储过程,会增加复杂度且性能不如直接JOIN高效。
内容的提问来源于stack exchange,提问作者ZZ Wave
相关产品推荐
相关产品推荐

