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

如何基于不同WHERE子句从表选多列并合并多个SQL查询为单查询

合并多条件SQL查询的解决方案

方案一:条件聚合+子查询(高效简洁)

直接在单条查询中整合所有需求,仅扫描PAYMENT表一次,效率更高:

SELECT
    COALESCE(SUM(AMOUNT), 0) AS TOTAL_AMOUNT,
    COALESCE(SUM(CASE WHEN STATE = 0 THEN AMOUNT ELSE 0 END), 0) AS NOT_SETTLED_AMOUNT,
    COALESCE(SUM(CASE WHEN STATE = 1 THEN AMOUNT ELSE 0 END), 0) AS SETTLED_AMOUNT,
    (SELECT CREATION_DATE FROM PAYMENT WHERE PAYMENT_ID = (SELECT MAX(PAYMENT_ID) FROM PAYMENT)) AS LATEST_PAYMENT_DATE,
    (SELECT MAX(ID) FROM INQUIRY) AS MAX_INQUIRY_ID
FROM PAYMENT;

逻辑说明:

  • 总金额/分状态金额:用CASE WHEN实现条件聚合,只对符合状态的AMOUNT求和;COALESCE用来处理表为空时返回0而非NULL的情况(可根据业务需求移除)。
  • 最新付款日期:保留原查询的子查询逻辑,直接作为列返回。
  • INQUIRY表最大ID:通过子查询获取该值,作为独立列输出。

方案二:子查询交叉连接(逻辑清晰)

如果希望拆分不同表的查询逻辑,用交叉连接的方式更易维护:

SELECT
    pay_stats.TOTAL_AMOUNT,
    pay_stats.NOT_SETTLED_AMOUNT,
    pay_stats.SETTLED_AMOUNT,
    pay_stats.LATEST_PAYMENT_DATE,
    inquiry_stats.MAX_INQUIRY_ID
FROM (
    SELECT
        COALESCE(SUM(AMOUNT), 0) AS TOTAL_AMOUNT,
        COALESCE(SUM(CASE WHEN STATE = 0 THEN AMOUNT ELSE 0 END), 0) AS NOT_SETTLED_AMOUNT,
        COALESCE(SUM(CASE WHEN STATE = 1 THEN AMOUNT ELSE 0 END), 0) AS SETTLED_AMOUNT,
        (SELECT CREATION_DATE FROM PAYMENT WHERE PAYMENT_ID = (SELECT MAX(PAYMENT_ID) FROM PAYMENT)) AS LATEST_PAYMENT_DATE
    FROM PAYMENT
) pay_stats
CROSS JOIN (
    SELECT MAX(ID) AS MAX_INQUIRY_ID FROM INQUIRY
) inquiry_stats;

这种方式将PAYMENT的统计和INQUIRY的查询拆分为两个独立子查询,再通过CROSS JOIN合并结果,逻辑更直观,适合复杂场景下的后续维护。

内容的提问来源于stack exchange,提问作者masoome

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:45:04