具有相同参数的多个数据库查询的联合

Union of multiple Database queries with same parameters

我按预期获得了此代码及其 运行。但是我正在尝试找到一种更好的方法来重写以下查询,因为可以看出日期和帐户代码一直在重复。

正在从 3 个数据库中提取数据,即 Db1、Db2 和 Db3。 每个数据库的表都是相似的。连要提取的AcctCodes都差不多

所以,我想知道下面的代码是否可以改写成几行。

由于 AcctCodes 相似,因此在每个查询之间添加一个数据库名称为 Headers 的空行有助于我识别它们。

Select 'Outlet1','0','0' from Dummy

所以如果下面的代码有更好的版本,请告诉我。谢谢

Select 'Outlet1','0','0' from Dummy

UNION ALL

SELECT 
    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"
    WHERE 
        T1."AcctCode" in
        (
        '105004001','105005001','105006001','105007001','105008001','105009001','105104001','105105001','105106001',
        '105107001','105108001','105109001','106001001','107009001','109018001','109022001','201001001','201002001'
        )      
        AND '01.01.0001' <= '01.07.2020'  
        AND '31.03.2021' >= T0."RefDate"  
    GROUP BY T1."AcctCode",T1."AcctName"

UNION ALL

Select 'Outlet2','0','0' from Dummy

UNION ALL

SELECT 
    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"
    WHERE 
        T1."AcctCode" in
        (
        '105004001','105005001','105006001','105007001','105008001','105009001','105104001','105105001','105106001',
        '105107001','105108001','105109001','106001001','107009001','109018001','109022001','201001001','201002001'
        )      
        AND '01.01.0001' <= '01.07.2020'  
        AND '31.03.2021' >= T0."RefDate"  
    GROUP BY T1."AcctCode",T1."AcctName"

UNION ALL

Select 'Outlet3','0','0' from Dummy

UNION ALL

SELECT 
    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"
    WHERE 
        T1."AcctCode" in
        (
        '105004001','105005001','105006001','105007001','105008001','105009001','105104001','105105001','105106001',
        '105107001','105108001','105109001','106001001','107009001','109018001','109022001','201001001','201002001'
        )      
        AND '01.01.0001' <= '01.07.2020'  
        AND '31.03.2021' >= T0."RefDate"  
    GROUP BY T1."AcctCode",T1."AcctName"

我现在重新构建了我的代码,现在它看起来像这样。

SELECT 
    'Databse1' 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"
    WHERE 
        T1."AcctCode" in
        (
        '105004001','105005001','105006001','105007001','105008001'
        )      
        AND '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"
    WHERE 
        T1."AcctCode" in
        (
        '105004001','105005001','105006001','105007001' ,'105008001' 
        )      
        AND '01.01.0001' <= '01.07.2020'  
        AND '31.03.2021' >= T0."RefDate"  
    GROUP BY T1."AcctCode",T1."AcctName"

UNION ALL

SELECT 
    'Database3' As DataDource,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"
    WHERE 
        T1."AcctCode" in
        (
        '105004001','105005001','105006001','105007001', '105008001'
        )      
        AND '01.01.0001' <= '01.07.2020'  
        AND '31.03.2021' >= T0."RefDate"  
    GROUP BY T1."AcctCode",T1."AcctName"

所以,我的问题是,是否可以在全局范围内提及 AcctCode,即 AcctCode 对所有人都是相同的,并且所有子查询都将使用相同的 AcctCode...

实现这个“合并来自 n 个不同数据库的结果”是很常见的。 大多数时候,这是通过数据仓库完成的。

HANA 允许创建 虚拟 tables 代表 tables 或 远程系统 中的视图 - 这是非常受 HANA 销售人员欢迎的集成方案的基础:“...只需将您的所有数据库集成到 HANA 中...无需数据仓库和大量数据提升...

我认为这是其中一种情况。

那么,有哪些选项可以只指定一次选择参数?

一种简单的方法是使用查询参数。 这可以通过用户定义的table函数参数化视图来完成(是的,也可以通过计算视图和参数,但我会此处略过)。

所以,有了这个就可以这样写了:

CREATE VIEW CombinedOutletBalances 
                (startReferencePeriod NVARCHAR(10),
                 endReferencePeriod  NVARCHAR(10))
    as
    
    WITH selAcctCodes as 
       (SELECT '105004001' as "AcctCode" FROM DUMMY UNION ALL 
        SELECT '105005001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '105006001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '105007001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '105008001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '105009001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '105104001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '105105001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '105106001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '105107001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '105108001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '105109001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '106001001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '107009001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '109018001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '109022001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '201001001' as "AcctCode" FROM DUMMY UNION ALL  
        SELECT '201002001' as "AcctCode" FROM DUMMY) 
       
    SELECT 
        'Outlet1' 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 selAcctCodes sac ON T1."AcctCode" = sac."AcctCode"
    WHERE 
             '01.01.0001' <= :startReferencePeriod
        AND :endReferencePeriod >= T0."RefDate"   
    GROUP BY 
            T1."AcctCode", T1."AcctName"
 UNION ALL  
    SELECT 
         'Outlet2' 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 selAcctCodes sac ON T1."AcctCode" = sac."AcctCode"
    WHERE 
             '01.01.0001' <= :startReferencePeriod
        AND :endReferencePeriod >= T0."RefDate"   
    GROUP BY 
            T1."AcctCode", T1."AcctName"
 UNION ALL
    SELECT 
        'Outlet3' 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 selAcctCodes sac ON T1."AcctCode" = sac."AcctCode"
        WHERE 
                '01.01.0001' <= :startReferencePeriod
            AND :endReferencePeriod >= T0."RefDate"  
        GROUP BY 
            T1."AcctCode", T1."AcctName";

这将重复减少到纯 HANA 中可以完成的最少工作 SQL。

如果 AcctCode 的选择应该更灵活,那么下一个最佳选择是用所选代码填充临时 table 并加入它而不是常见的 table 表达式。

请注意,我将 DataSource 拉入了实际的数据查询,这样结果集仍然可以在进一步的查询和报告工具中处理,而不会搞砸结果数据(例如,“行在- between" 方法,你将无法再正确计算平均值)。

另请注意,如果不同的源 table 确实在远程数据库上,这可能不会很好地执行。您可能想要对此进行广泛测试。