基于inno关联两张表生成指定结果集的SQL实现问题
问题描述
现有两张表,结构及数据如下:
table1表
header type agrid inno stallno 0 D 14 001 000 0 D 14 008 000 0 N 14 008 000
另一张表(假设名为table2)
header type agrid inno stallno 1 NULL 14 001 000 1 NULL 14 008 000
需要生成如下结果集:
header type agrid inno 0 D 14 001 1 NULL 14 001 0 D 14 008 1 NULL 14 008 0 N 14 008 1 NULL 14 008
尝试使用row_number()函数实现,但仅部分agrid生效,其余无法得到正确结果,求可行解决方法。
解决方案
这里不需要用row_number(),核心需求是让table1中的每一行,都对应table2中相同agrid和inno的行,然后将两部分数据合并后排序。可以通过UNION ALL结合关联查询实现:
SELECT header, type, agrid, inno FROM ( -- 包含table1的所有原始行 SELECT header, type, agrid, inno FROM table1 UNION ALL -- 关联table2,取出与table1每行匹配的对应行 SELECT t2.header, t2.type, t2.agrid, t2.inno FROM table1 t1 JOIN table2 t2 ON t1.agrid = t2.agrid AND t1.inno = t2.inno ) AS combined_data -- 按要求排序,保证同agrid、inno的行排在一起,header小的在前 ORDER BY agrid, inno, header;
逻辑说明
- 第一部分直接取出
table1的所有行,保留原始数据; - 第二部分通过
JOIN关联table1和table2,匹配条件为agrid和inno一致,这样table1中每一行都会对应到table2中符合条件的行; - 用
UNION ALL合并两部分数据(注意用UNION ALL而非UNION,避免去重丢失数据); - 最后按
agrid、inno、header排序,得到期望的结果顺序。
内容的提问来源于stack exchange,提问作者CVV
相关产品推荐
相关产品推荐

