You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从两个查询中获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:37:14