SQL查询需求:将同ID两行数据合并为单行并区分字段
解决docs表同ID多行合并为单行的问题
你的问题出在自连接的时候只匹配了id,没有限定版本号(rev)的对应关系,所以同id的所有行都进行了笛卡尔积匹配,才会得到4条冗余结果。我们需要明确指定rev=1的行作为历史版本(prior),rev=2的行作为当前版本(curr),在JOIN条件里加上这个限制就能得到预期结果。
正确的SQL查询语句
SELECT A.id, A.content AS priorcontent, B.content AS currcontent, A.test AS priortest, B.test AS currtest FROM docs A INNER JOIN docs B ON A.id = B.id AND A.rev = 1 -- 指定A是rev=1的历史行 AND B.rev = 2; -- 指定B是rev=2的当前行
结果验证
执行这条语句后,会精准返回你想要的单行结果:
id priorcontent currcontent priortest currtest --------------------------------------------------- 1 11 22 33 44
扩展通用写法(适用于多版本场景)
如果你的业务场景中,历史版本和当前版本不是固定的rev=1和rev=2(比如要合并同ID下最早和最新的版本),可以用子查询动态获取每个ID的最小/最大版本,避免硬编码版本号:
SELECT A.id, A.content AS priorcontent, B.content AS currcontent, A.test AS priortest, B.test AS currtest FROM ( SELECT * FROM docs WHERE (id, rev) IN (SELECT id, MIN(rev) FROM docs GROUP BY id) ) A INNER JOIN ( SELECT * FROM docs WHERE (id, rev) IN (SELECT id, MAX(rev) FROM docs GROUP BY id) ) B ON A.id = B.id;
内容的提问来源于stack exchange,提问作者user9807332
相关产品推荐
相关产品推荐

