多表关联查询需求:合并detalle_contrato与detalle_tradicional查询结果
合并两张表的统计结果解决方案
我来帮你搞定这个合并查询的需求!核心思路是先分别对两张表按ID_CONTRATO和NOM_VARIEDAD做分组统计,再通过这两个字段将结果关联起来,确保所有品种的统计数据都能完整显示(包括只在其中一张表存在的品种)。
方案1:支持全外连接(FULL OUTER JOIN)的数据库(如PostgreSQL、SQL Server、Oracle)
这种方式最直接,能同时保留两张表中所有匹配和不匹配的记录:
SELECT COALESCE(c.ID_CONTRATO, t.ID_CONTRATO) AS ID_CONTRATO, COALESCE(c.NOM_VARIEDAD, t.NOM_VARIEDAD) AS NOM_VARIEDAD, COALESCE(c.CANTIDAD, 0) AS CANTIDAD, COALESCE(t.CANTIDAD_D, 0) AS CANTIDAD_D FROM ( -- 从detalle_contrato统计CANTIDAD总和 SELECT ID_CONTRATO, NOM_VARIEDAD, SUM(CANTIDAD) AS CANTIDAD FROM detalle_contrato WHERE ID_CONTRATO = '$ID' AND TIPO_VARIEDAD = 'TRADICIONAL' GROUP BY ID_CONTRATO, NOM_VARIEDAD ) c FULL OUTER JOIN ( -- 从detalle_tradicional统计CANTIDAD_D总和 SELECT ID_CONTRATO, NOM_VARIEDAD, SUM(CANTIDAD_D) AS CANTIDAD_D FROM detalle_tradicional WHERE ID_CONTRATO = '$ID' GROUP BY ID_CONTRATO, NOM_VARIEDAD ) t ON c.ID_CONTRATO = t.ID_CONTRATO AND c.NOM_VARIEDAD = t.NOM_VARIEDAD;
方案2:不支持全外连接的数据库(如MySQL)
如果你的数据库不支持FULL OUTER JOIN,可以用UNION ALL先把两个子查询的结果合并,再重新分组聚合:
SELECT ID_CONTRATO, NOM_VARIEDAD, SUM(CANTIDAD) AS CANTIDAD, SUM(CANTIDAD_D) AS CANTIDAD_D FROM ( -- 第一个子查询的结果,CANTIDAD_D设为0 SELECT ID_CONTRATO, NOM_VARIEDAD, SUM(CANTIDAD) AS CANTIDAD, 0 AS CANTIDAD_D FROM detalle_contrato WHERE ID_CONTRATO = '$ID' AND TIPO_VARIEDAD = 'TRADICIONAL' GROUP BY ID_CONTRATO, NOM_VARIEDAD UNION ALL -- 第二个子查询的结果,CANTIDAD设为0 SELECT ID_CONTRATO, NOM_VARIEDAD, 0 AS CANTIDAD, SUM(CANTIDAD_D) AS CANTIDAD_D FROM detalle_tradicional WHERE ID_CONTRATO = '$ID' GROUP BY ID_CONTRATO, NOM_VARIEDAD ) combined GROUP BY ID_CONTRATO, NOM_VARIEDAD;
关键说明
COALESCE函数用来处理关联时可能出现的NULL值,把没有统计到的数值转为0,避免结果出现空值。- 两个方案都严格筛选指定
$ID的记录,并且按品种分组统计总和。 - 如果业务中两张表的
NOM_VARIEDAD是完全对应的,也可以用LEFT JOIN或RIGHT JOIN代替全外连接,但全外连接更稳妥,能覆盖所有可能的情况。
内容的提问来源于stack exchange,提问作者Diego Valenzuela
相关产品推荐
相关产品推荐

