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

多库UNION查询重复参数优化:如何全局设置统一AcctCode筛选条件

当然可以,你可以通过以下方案实现AcctCode列表的全局复用,彻底消除重复代码:

方案1:使用CTE(公用表表达式)定义全局账号列表

绝大多数主流数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)都支持CTE语法,你可以在查询最开头一次性定义所有要筛选的AcctCode,后续所有子查询直接复用即可,同时还可以顺带把重复的日期条件也统一处理:

WITH target_accts AS (
    SELECT '105004001' AS AcctCode UNION ALL
    SELECT '105005001' UNION ALL
    SELECT '105006001' UNION ALL
    SELECT '105007001' UNION ALL
    SELECT '105008001' UNION ALL
    -- 剩余需要的账号都统一加在这里即可,后续不用重复写
    SELECT '105009001' UNION ALL
    SELECT '105104001' UNION ALL
    SELECT '105105001' UNION ALL
    SELECT '105106001' UNION ALL
    SELECT '105107001' UNION ALL
    SELECT '105108001' UNION ALL
    SELECT '105109001' UNION ALL
    SELECT '106001001' UNION ALL
    SELECT '107009001' UNION ALL
    SELECT '109018001' UNION ALL
    SELECT '109022001' UNION ALL
    SELECT '201001001' UNION ALL
    SELECT '201002001'
)
SELECT 
    'Database1' as DataSource,T1."AcctCode",T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as TotalBal
FROM Db1.Table1 T0  
INNER JOIN Db1.Table2 T1 ON T0."Account" = T1."AcctCode" 
INNER JOIN Db1.Table3 T2 ON T0."TransId" = T2."TransId"
INNER JOIN target_accts ta ON T1."AcctCode" = ta.AcctCode
WHERE 
    '01.01.0001' <= '01.07.2020'  
    AND '31.03.2021' >= T0."RefDate"  
GROUP BY T1."AcctCode",T1."AcctName"

UNION ALL

SELECT 
    'Database2' As DataSource,T1."AcctCode",T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as TotalBal
FROM Db2.Table1 T0  
INNER JOIN Db2.Table2 T1 ON T0."Account" = T1."AcctCode" 
INNER JOIN Db2.Table3 T2 ON T0."TransId" = T2."TransId"
INNER JOIN target_accts ta ON T1."AcctCode" = ta.AcctCode
WHERE 
    '01.01.0001' <= '01.07.2020'  
    AND '31.03.2021' >= T0."RefDate"  
GROUP BY T1."AcctCode",T1."AcctName"

UNION ALL

SELECT 
    'Database3' As DataSource,T1."AcctCode",T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as TotalBal
FROM Db3.Table1 T0  
INNER JOIN Db3.Table2 T1 ON T0."Account" = T1."AcctCode" 
INNER JOIN Db3.Table3 T2 ON T0."TransId" = T2."TransId"
INNER JOIN target_accts ta ON T1."AcctCode" = ta.AcctCode
WHERE 
    '01.01.0001' <= '01.07.2020'  
    AND '31.03.2021' >= T0."RefDate"  
GROUP BY T1."AcctCode",T1."AcctName"

如果你使用的数据库支持自定义变量,还可以把重复的日期常量也定义成变量,后续修改只需要改一处即可。
如果不支持CTE,也可以用临时表存储目标账号列表,效果和CTE一致,适合账号数量较多的场景。如果这组账号是业务常用的固定编码,还可以专门建一个配置表存储,后续调整账号筛选范围只需要修改配置表数据,不需要改动SQL代码。

注:你之前重构后的代码里第三个查询的DataSource字段拼写错误为DataDource,优化时可以同步修正。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 18:36:08