如何从两个查询中获取ID相同的分组记录?附首个查询示例
如何获取两个查询中ID相同的分组记录
嘿,我来帮你搞定这个问题——要从两个查询结果里找出id相同的分组记录,其实有几种实用的方法,我结合你给出的第一个查询来具体说明:
方法1:用INNER JOIN关联两个子查询
这是最通用的方法,不管你用的是MySQL、PostgreSQL还是SQL Server都适用。核心思路是把两个查询都包装成子查询,然后通过id字段做内连接,这样就能筛选出两边都存在的id对应的记录。
假设你的第一个查询完整后是这样(注意要补上GROUP BY,因为用了聚合函数SUM,必须指定分组字段):
SELECT final.id, mutasi.nomor_voucher, SUM(detail.pembayaran) as pembayaran FROM petty_cash_mutasi_kas mutasi INNER JOIN petty_cash_bukti_pengeluaran keluar ON keluar.id = mutasi.petty_cash_bukti_pengeluaran_id INNER JOIN job_order_final final ON final.id = keluar.job_order_final_id INNER JOIN job_order_final_detail detail ON detail.job_order_final_id = final.id INNER JOIN job_order job_order ON job_order.id = final.job_order_id -- 补全你没写完的关联 GROUP BY final.id, mutasi.nomor_voucher
假设第二个查询是另一个需要匹配的统计查询,那你可以这么写:
SELECT q1.id, q1.nomor_voucher, q1.pembayaran, q2.other_column -- 按需选择字段 FROM ( -- 第一个查询(补全后的) SELECT final.id, mutasi.nomor_voucher, SUM(detail.pembayaran) as pembayaran FROM petty_cash_mutasi_kas mutasi INNER JOIN petty_cash_bukti_pengeluaran keluar ON keluar.id = mutasi.petty_cash_bukti_pengeluaran_id INNER JOIN job_order_final final ON final.id = keluar.job_order_final_id INNER JOIN job_order_final_detail detail ON detail.job_order_final_id = final.id INNER JOIN job_order job_order ON job_order.id = final.job_order_id GROUP BY final.id, mutasi.nomor_voucher ) AS q1 INNER JOIN ( -- 第二个查询,替换成你的实际查询语句 SELECT id, other_column FROM some_table GROUP BY id, other_column ) AS q2 ON q1.id = q2.id
方法2:用INTERSECT(适用于支持该语法的数据库)
如果你的数据库支持INTERSECT(比如PostgreSQL、SQL Server、Oracle等),这会是更简洁的方式——它直接返回两个查询结果的交集,自动筛选出两边都存在的记录(要求两个查询的列数、字段类型完全一致)。
示例:
-- 第一个查询 SELECT final.id, mutasi.nomor_voucher, SUM(detail.pembayaran) as pembayaran FROM petty_cash_mutasi_kas mutasi INNER JOIN petty_cash_bukti_pengeluaran keluar ON keluar.id = mutasi.petty_cash_bukti_pengeluaran_id INNER JOIN job_order_final final ON final.id = keluar.job_order_final_id INNER JOIN job_order_final_detail detail ON detail.job_order_final_id = final.id INNER JOIN job_order job_order ON job_order.id = final.job_order_id GROUP BY final.id, mutasi.nomor_voucher INTERSECT -- 第二个查询,注意列数和类型要和第一个一致 SELECT id, nomor_voucher, other_aggregate_value FROM another_query GROUP BY id, nomor_voucher
方法3:用IN子句筛选
如果其中一个查询的结果集比较小,你可以用IN子句来筛选另一个查询的结果,写法更直观:
SELECT final.id, mutasi.nomor_voucher, SUM(detail.pembayaran) as pembayaran FROM petty_cash_mutasi_kas mutasi INNER JOIN petty_cash_bukti_pengeluaran keluar ON keluar.id = mutasi.petty_cash_bukti_pengeluaran_id INNER JOIN job_order_final final ON final.id = keluar.job_order_final_id INNER JOIN job_order_final_detail detail ON detail.job_order_final_id = final.id INNER JOIN job_order job_order ON job_order.id = final.job_order_id WHERE final.id IN ( -- 第二个查询,只返回id列 SELECT id FROM some_table GROUP BY id ) GROUP BY final.id, mutasi.nomor_voucher
要注意的关键点
- 两个查询都要确保
id是分组后唯一的(或者符合你的业务匹配逻辑),避免出现一对多的匹配导致结果重复。 - 第一个查询里用了
SUM(detail.pembayaran),一定要记得加上GROUP BY final.id, mutasi.nomor_voucher(以及其他非聚合字段),不然数据库会报错(除非你的数据库有特殊配置,但这是标准SQL要求)。
内容的提问来源于stack exchange,提问作者Fadly Dzil
相关产品推荐
相关产品推荐

