MySQL中如何不使用UNION合并两个SELECT查询(横向追加列)
实现横向合并查询结果的方法
当然可以实现这种横向追加列的合并效果,不需要用UNION/UNION ALL,你可以通过**JOIN(连接)**操作来实现,具体分两种情况处理:
方法1:基于共同字段关联
如果两个查询结果存在可以关联的共同字段(比如示例里的Ano),可以直接通过该字段进行连接:
SELECT q1.N_utente AS N_utente, q1.Ano, q1.Mes AS Mes8, q1.Farmacia AS Farmacia8, q2.Mes AS Mes9, q2.Cabeleireiro AS Cabeleireiro9 FROM ( -- 第一个查询,起别名q1 SELECT N_utente, Ano, Mes, Farmacia FROM raddb.Areceber WHERE N_utente <> '0' AND Farmacia <> '0.00' AND Mes = '1' ) q1 JOIN ( -- 第二个查询,起别名q2 SELECT N_utente, Ano, Mes, Cabeleireiro FROM raddb.Areceber WHERE N_utente <> '0' AND Cabeleireiro <> '0.00' AND Mes = '1' ) q2 ON q1.Ano = q2.Ano; -- 可根据实际业务调整关联字段
方法2:基于行号关联(无共同关联字段时)
如果两个查询结果没有合适的共同关联字段,只是需要按结果行的顺序横向拼接,可以给每个查询添加行号,再通过行号连接:
SELECT q1.N_utente, q1.Ano, q1.Mes AS Mes8, q1.Farmacia AS Farmacia8, q2.Mes AS Mes9, q2.Cabeleireiro AS Cabeleireiro9 FROM ( SELECT N_utente, Ano, Mes, Farmacia, ROW_NUMBER() OVER (ORDER BY N_utente) AS row_num -- 添加行号 FROM raddb.Areceber WHERE N_utente <> '0' AND Farmacia <> '0.00' AND Mes = '1' ) q1 JOIN ( SELECT N_utente, Ano, Mes, Cabeleireiro, ROW_NUMBER() OVER (ORDER BY N_utente) AS row_num -- 添加行号 FROM raddb.Areceber WHERE N_utente <> '0' AND Cabeleireiro <> '0.00' AND Mes = '1' ) q2 ON q1.row_num = q2.row_num;
注意事项
- 如果两个查询结果行数不一致,
INNER JOIN只会保留两边都有匹配的行;若要保留所有行,可使用FULL OUTER JOIN(部分数据库支持,MySQL需通过UNION+LEFT JOIN+RIGHT JOIN模拟)。 - 你需要的自定义列名(如
Mes8)可通过AS关键字指定,与目标结果对应。
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

