如何横向拼接两个行数相同但无关联的MySQL查询结果?
解决方案
由于两个查询没有共同关联字段,但行数一致且需要按各自排序结果一一对应合并,可以通过给两个查询分别添加行号,再通过行号关联来实现需求:
完整SQL语句
SELECT q1.id, q1.name_id, q1.content, q1.create_time, q2.validity, q2.code, q2.image FROM ( SELECT `namelist`.`id`, `name`.`id` AS `name_id`, `name_item`.`content`, `order`.`create_time`, ROW_NUMBER() OVER (ORDER BY `name`.`id`) AS rn FROM `namelist` LEFT JOIN `name` ON `name`.`namelist_id` = `namelist`.`id` LEFT JOIN `name_item` ON `name_item`.`name_id` = `name`.`id` LEFT JOIN `order` ON `namelist`.`order_id` = `order`.`id` LEFT JOIN `items` ON `items`.`id` = `name_item`.`items_id` WHERE `namelist`.`order_id`=1380 AND `items`.`key`='Name' GROUP BY `name_item`.`content` ORDER BY `name`.`id` ) q1 JOIN ( SELECT `validity`, `code`, `image`, ROW_NUMBER() OVER (ORDER BY `id`) AS rn FROM `code` WHERE `code`.`order_id` = 1380 ORDER BY `id` ) q2 ON q1.rn = q2.rn;
原理说明
- 添加行号:用
ROW_NUMBER()窗口函数分别为两个查询的结果按各自的排序规则生成唯一行号rn,以此作为临时关联键。 - 按行号关联:通过
JOIN ... ON q1.rn = q2.rn将两个查询的结果按行号一一对应合并,既避免了CROSS JOIN产生的笛卡尔积重复,也不会像UNION那样将结果追加成多行。
注意:需确保两个子查询的行数完全一致,否则会出现部分数据匹配不到的情况(若要保留所有行可改用LEFT JOIN)。
内容的提问来源于stack exchange,提问作者Laci K
相关产品推荐
相关产品推荐

