如何基于一列连接多个表的结果(通过UNION ALL)
How to join the results of multiple tables based on one column (via UNION ALL)
好吧,我写的 SQL 语句工作正常,但我想减少它的体积并只使用一个 'ACCEPTANCE_DATE' 因为它在所有 [=29= 中都是相同的]s.
我正在尝试使用 UNION ALL 语句连接多个 table 的结果。下面的例子工作得很好。
SEL COUNT(*)FROM
MY_DATABASE.HUMAN_RESOURCES
WHERE ACCEPTANCE_DATE='2015-08-09'
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.FINANCIAL_RESOURCES
WHERE ACCEPTANCE_DATE='2015-08-09'
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES
WHERE ACCEPTANCE_DATE='2015-08-09';
所有 table 都有相同类型的列,例如每个 table 都有一个名为“ACCEPTANCE_DATE”的列。我得到的结果是正确的。尽管如此,我在一个查询中组合了很多 tables(使用 UNION ALL)并且想知道是否有一种方法可以转换这个查询所以我不必更新
ACCEPTANCE_DATE='2015-08-09' 在每个 select 语句中。理想情况下,我只想定义一次,尤其是当我使用超过 30 个 UNION ALL 子句时,例如
SEL * FROM
(SEL COUNT(*)FROM
MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES) AS T1
WHERE ACCEPTANCE_DATE='2015-08-09';
下面的语句获取数据。
SEL COUNT(*)FROM
MY_DATABASE.HUMAN_RESOURCES
WHERE ACCEPTANCE_DATE='2015-08-09'
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.FINANCIAL_RESOURCES
WHERE ACCEPTANCE_DATE='2015-08-09'
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES
WHERE ACCEPTANCE_DATE='2015-08-09';
如上所述,我希望它像下面这样:
SEL * FROM
(SEL COUNT(*)FROM
MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES) AS T1
WHERE ACCEPTANCE_DATE='2015-08-09';
也许这就是您要找的:
SEL COUNT(*) FROM
(SEL ACCEPTANCE_DATE, 1 AS ORIGIN FROM
MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 2 AS ORIGIN FROM
MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 3 AS ORIGIN FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES) AS T1
WHERE ACCEPTANCE_DATE='2015-08-09'
GROUP BY ORIGIN;
你甚至可以给 ORIGIN 一些更有意义的名字,然后再显示它们:
SEL ORIGIN, COUNT(*) FROM
(SEL ACCEPTANCE_DATE, 'HUMAN' AS ORIGIN FROM
MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 'FINANCIAL' AS ORIGIN FROM
MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 'INFRASTRUCTURE' AS ORIGIN FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES) AS T1
WHERE ACCEPTANCE_DATE='2015-08-09'
GROUP BY ORIGIN;
结果是两列。现在,它仍然没有解决不显示第三个值的问题,但是这样您就知道缺少哪些值并且可以轻松区分哪些应该为零。如果这对您来说还不够,那么代码会变得更糟糕。以后可能会想到解决办法。
为了解决空 tables 缺少条目的问题,我想到了两种可能的解决方案。选择取决于操作是否只执行一次,或者这是重复发生的操作还是只执行一次事件。如果您计划多次执行此操作,最好在数据库上创建一个包含所有来源 table 名称(或一些快捷方式,您会明白)的 table。对于这个最小的例子,让我们考虑名称 SOURCE_TABLES:
下存在这样的东西
SELECT RESOURCE FROM SOURCE_TABLES
/*
RESOURCE:
HUMAN
FINANCIAL
INFRASTRUCTURE
*/
在这种情况下,之前提供的脚本只需要稍作修改:
SEL ST.RESOURCE, COUNT(T1.ACCEPTANCE_DATE) FROM SOURCE_TABLES ST
LEFT JOIN (SEL ACCEPTANCE_DATE, 'HUMAN' AS ORIGIN FROM
MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 'FINANCIAL' AS ORIGIN FROM
MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 'INFRASTRUCTURE' AS ORIGIN FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES) AS T1
ON ST.RESOURCE = T1.ORIGIN
WHERE ACCEPTANCE_DATE='2015-08-09'
GROUP BY ST.RESOURCE;
在这里,通过使用 LEFT JOIN,您可以确保 table 中的每个条目都出现在输出中,即使在 T1 中没有指定来源的行。 COUNT(T1.ACCEPTANCE_DATE) 利用了这样一个事实,即 NULL 不会加到计数器中。
现在,如果出于任何原因您不喜欢创建 table 的想法(您不能在数据库上创建对象,或者对于单个操作来说太麻烦了),您可以坚持更容易即时生成的数字的想法。下面的解决方案利用了与上面相同的想法,但在读取的 table 数量方面更加灵活,并且显然不需要您创建额外的 table。考虑到您提到的 30 tables,这可能是一个更好的选择。有人可能会争辩说它的可读性较差:
WITH numbers AS (
SEL 1 AS number
UNION ALL
SEL number + 1 FROM numbers WHERE number + 1 <= 3 -- Change 3 to the number of sourcing tables
), input_merged AS ( -- if we already use the WITH clause we can do so for merging input. It's more readable
SEL ACCEPTANCE_DATE, 1 AS ORIGIN FROM MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 2 AS ORIGIN FROM MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 3 AS ORIGIN FROM MY_DATABASE.INFRASTRUCTURE_RESOURCES
-- add further sources accordingly...
)
SEL COUNT(ACCEPTANCE_DATE) FROM numbers n
LEFT JOIN input_merged im ON n.number = im.ORIGIN
WHERE ACCEPTANCE_DATE='2015-08-09'
GROUP BY n.number;
这应该会产生第一个询问和期望的输出。
至于 WITH 语句中的 numbers 部分,您可能需要参考 this,请注意,在此解决方案中,我使用 WITH 也像 Christoph 那样合并输入.如果您使用 ORACLE 数据库,使用 CONNECT BY LEVEL 可能是创建数字序列的更好选择。
希望现在你可以实现你想要的!
不确定这是标准 SQL 还是 Microsoft 语法,但在 Microsoft SQL Server 中你可以这样做:
WITH PreSelect AS (
SELECT ACCEPTANCE_DATE FROM HUMAN_RESOURCES
UNION ALL
SELECT ACCEPTANCE_DATE FROM FINANCIAL_RESOURCES
UNION ALL
SELECT ACCEPTANCE_DATE FROM INFRASTRUCTURE_RESOURCES
)
SELECT COUNT(*) FROM PreSelect WHERE ACCEPTANCE_DATE = '2015-08-09';
或者如果您需要单独的每个值,则使用 TheDecks 建议的原点。
第二次尝试:
WITH PreSelect AS (
SELECT 'Infrastructure Resources' AS Origin, ACCEPTANCE_DATE FROM INFRASTRUCTURE_RESOURCES
UNION ALL
SELECT 'Human Resources' AS Origin, ACCEPTANCE_DATE FROM HUMAN_RESOURCES
UNION ALL
SELECT 'Financial Resources' AS Origin, ACCEPTANCE_DATE FROM FINANCIAL_RESOURCES
)
SELECT Origin, COUNT(*) FROM PreSelect
WHERE ACCEPTANCE_DATE = '2015-08-09'
GROUP BY Origin
ORDER BY 2 DESC;
本版不总结,提供口语标签,由大到小排序
是的,cte 是最好的选择...在 CTE 中,它使用结果中的 where 子句过滤数据(联合所有)
第三次尝试:
WITH PreSelect AS (
SELECT 'Infrastructure Resources' AS Origin, ACCEPTANCE_DATE FROM INFRASTRUCTURE_RESOURCES
UNION ALL
SELECT 'Human Resources' AS Origin, ACCEPTANCE_DATE FROM HUMAN_RESOURCES
UNION ALL
SELECT 'Financial Resources' AS Origin, ACCEPTANCE_DATE FROM FINANCIAL_RESOURCES
),
Categories AS (
SELECT DISTINCT Origin FROM PreSelect
),
ReferenceDate AS (
SELECT Origin, COUNT(*) RecordCount FROM PreSelect
WHERE ACCEPTANCE_DATE = '2015-08-09'
GROUP BY Origin
)
SELECT c.Origin, ISNULL(rd.RecordCount, 0) AS RecordCount FROM Categories c
LEFT OUTER JOIN ReferenceDate rd ON c.Origin = rd.Origin
ORDER BY 2 DESC;
这样也会出现包含 0 个条目的行...
如果您的问题是您只想定义 ACCEPTANCE_DATE
一次,那么您可以保留原来的 SQL 并使用宏或 SP 并将 ACCEPTANCE_DATE
参数化为输入值。
如果你想重写 SQL,也许可以试试这样:
SELECT MyCount FROM (
SELECT ACCEPTANCE_DATE, MyCount
FROM (
SELECT ACCEPTANCE_DATE, COUNT(*) AS MyCount
FROM MY_DATABASE.HUMAN_RESOURCES
GROUP BY ACCEPTANCE_DATE
)
UNION ALL
SELECT ACCEPTANCE_DATE, MyCount
FROM (
SELECT ACCEPTANCE_DATE, COUNT(*) AS MyCount
FROM MY_DATABASE.FINANCIAL_RESOURCES
GROUP BY ACCEPTANCE_DATE
)
UNION ALL
SELECT ACCEPTANCE_DATE, MyCount
FROM (
SELECT ACCEPTANCE_DATE, COUNT(*) AS MyCount
FROM MY_DATABASE.INFRASTRUCTURE_RESOURCES
GROUP BY ACCEPTANCE_DATE
)
) src
WHERE ACCEPTANCE_DATE = '2015-08-09';
如果您在这些表中有很多行,这可能不会很好地执行,除非您有一些优化,例如在 ACCEPTANCE_DATE
字段上定义的 PPI。
我没有对此进行测试,因此您可能会遇到一些语法错误需要解决,但它应该能满足您的需求。
您可以按照@ravioli 的建议使用宏:
REPLACE MACRO my_counts(inDate DATE) AS
(
SELECT 'HUMAN_RESOURCES' AS tab, Count(*)
FROM MY_DATABASE.HUMAN_RESOURCES
WHERE ACCEPTANCE_DATE=:inDate
UNION ALL
SELECT 'FINANCIAL_RESOURCES', Count(*)
FROM MY_DATABASE.FINANCIAL_RESOURCES
WHERE ACCEPTANCE_DATE=:inDate
UNION ALL
SELECT 'INFRASTRUCTURE_RESOURCES', Count(*)
FROM MY_DATABASE.INFRASTRUCTURE_RESOURCES
WHERE ACCEPTANCE_DATE=:inDate;
);
EXEC my_counts(DATE '2015-08-09');
在您拥有“创建宏”权限的数据库中或在您自己的用户中创建此宏(但除您之外没有其他人可以使用它)。
或者您使用通用Table表达式来定义日期:
WITH cte AS
(
SELECT DATE '2015-08-09' AS ACCEPTANCE_DATE
)
SELECT 'HUMAN_RESOURCES' AS tab, Count(*)
FROM MY_DATABASE.HUMAN_RESOURCES
WHERE ACCEPTANCE_DATE=(SELECT ACCEPTANCE_DATE FROM cte)
UNION ALL
SELECT 'FINANCIAL_RESOURCES', Count(*)
FROM MY_DATABASE.FINANCIAL_RESOURCES
WHERE ACCEPTANCE_DATE=(SELECT ACCEPTANCE_DATE FROM cte)
UNION ALL
SELECT 'INFRASTRUCTURE_RESOURCES', Count(*)
FROM MY_DATABASE.INFRASTRUCTURE_RESOURCES
WHERE ACCEPTANCE_DATE=(SELECT ACCEPTANCE_DATE FROM cte);
(SELECT ACCEPTANCE_DATE FROM cte)
将执行一次,然后作为参数传递给每个Select。
好吧,我写的 SQL 语句工作正常,但我想减少它的体积并只使用一个 'ACCEPTANCE_DATE' 因为它在所有 [=29= 中都是相同的]s.
我正在尝试使用 UNION ALL 语句连接多个 table 的结果。下面的例子工作得很好。
SEL COUNT(*)FROM
MY_DATABASE.HUMAN_RESOURCES
WHERE ACCEPTANCE_DATE='2015-08-09'
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.FINANCIAL_RESOURCES
WHERE ACCEPTANCE_DATE='2015-08-09'
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES
WHERE ACCEPTANCE_DATE='2015-08-09';
所有 table 都有相同类型的列,例如每个 table 都有一个名为“ACCEPTANCE_DATE”的列。我得到的结果是正确的。尽管如此,我在一个查询中组合了很多 tables(使用 UNION ALL)并且想知道是否有一种方法可以转换这个查询所以我不必更新 ACCEPTANCE_DATE='2015-08-09' 在每个 select 语句中。理想情况下,我只想定义一次,尤其是当我使用超过 30 个 UNION ALL 子句时,例如
SEL * FROM
(SEL COUNT(*)FROM
MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES) AS T1
WHERE ACCEPTANCE_DATE='2015-08-09';
下面的语句获取数据。
SEL COUNT(*)FROM
MY_DATABASE.HUMAN_RESOURCES
WHERE ACCEPTANCE_DATE='2015-08-09'
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.FINANCIAL_RESOURCES
WHERE ACCEPTANCE_DATE='2015-08-09'
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES
WHERE ACCEPTANCE_DATE='2015-08-09';
如上所述,我希望它像下面这样:
SEL * FROM
(SEL COUNT(*)FROM
MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL COUNT(*)FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES) AS T1
WHERE ACCEPTANCE_DATE='2015-08-09';
也许这就是您要找的:
SEL COUNT(*) FROM
(SEL ACCEPTANCE_DATE, 1 AS ORIGIN FROM
MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 2 AS ORIGIN FROM
MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 3 AS ORIGIN FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES) AS T1
WHERE ACCEPTANCE_DATE='2015-08-09'
GROUP BY ORIGIN;
你甚至可以给 ORIGIN 一些更有意义的名字,然后再显示它们:
SEL ORIGIN, COUNT(*) FROM
(SEL ACCEPTANCE_DATE, 'HUMAN' AS ORIGIN FROM
MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 'FINANCIAL' AS ORIGIN FROM
MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 'INFRASTRUCTURE' AS ORIGIN FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES) AS T1
WHERE ACCEPTANCE_DATE='2015-08-09'
GROUP BY ORIGIN;
结果是两列。现在,它仍然没有解决不显示第三个值的问题,但是这样您就知道缺少哪些值并且可以轻松区分哪些应该为零。如果这对您来说还不够,那么代码会变得更糟糕。以后可能会想到解决办法。
为了解决空 tables 缺少条目的问题,我想到了两种可能的解决方案。选择取决于操作是否只执行一次,或者这是重复发生的操作还是只执行一次事件。如果您计划多次执行此操作,最好在数据库上创建一个包含所有来源 table 名称(或一些快捷方式,您会明白)的 table。对于这个最小的例子,让我们考虑名称 SOURCE_TABLES:
下存在这样的东西SELECT RESOURCE FROM SOURCE_TABLES
/*
RESOURCE:
HUMAN
FINANCIAL
INFRASTRUCTURE
*/
在这种情况下,之前提供的脚本只需要稍作修改:
SEL ST.RESOURCE, COUNT(T1.ACCEPTANCE_DATE) FROM SOURCE_TABLES ST
LEFT JOIN (SEL ACCEPTANCE_DATE, 'HUMAN' AS ORIGIN FROM
MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 'FINANCIAL' AS ORIGIN FROM
MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 'INFRASTRUCTURE' AS ORIGIN FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES) AS T1
ON ST.RESOURCE = T1.ORIGIN
WHERE ACCEPTANCE_DATE='2015-08-09'
GROUP BY ST.RESOURCE;
在这里,通过使用 LEFT JOIN,您可以确保 table 中的每个条目都出现在输出中,即使在 T1 中没有指定来源的行。 COUNT(T1.ACCEPTANCE_DATE) 利用了这样一个事实,即 NULL 不会加到计数器中。
现在,如果出于任何原因您不喜欢创建 table 的想法(您不能在数据库上创建对象,或者对于单个操作来说太麻烦了),您可以坚持更容易即时生成的数字的想法。下面的解决方案利用了与上面相同的想法,但在读取的 table 数量方面更加灵活,并且显然不需要您创建额外的 table。考虑到您提到的 30 tables,这可能是一个更好的选择。有人可能会争辩说它的可读性较差:
WITH numbers AS (
SEL 1 AS number
UNION ALL
SEL number + 1 FROM numbers WHERE number + 1 <= 3 -- Change 3 to the number of sourcing tables
), input_merged AS ( -- if we already use the WITH clause we can do so for merging input. It's more readable
SEL ACCEPTANCE_DATE, 1 AS ORIGIN FROM MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 2 AS ORIGIN FROM MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 3 AS ORIGIN FROM MY_DATABASE.INFRASTRUCTURE_RESOURCES
-- add further sources accordingly...
)
SEL COUNT(ACCEPTANCE_DATE) FROM numbers n
LEFT JOIN input_merged im ON n.number = im.ORIGIN
WHERE ACCEPTANCE_DATE='2015-08-09'
GROUP BY n.number;
这应该会产生第一个询问和期望的输出。
至于 WITH 语句中的 numbers 部分,您可能需要参考 this,请注意,在此解决方案中,我使用 WITH 也像 Christoph 那样合并输入.如果您使用 ORACLE 数据库,使用 CONNECT BY LEVEL 可能是创建数字序列的更好选择。
希望现在你可以实现你想要的!
不确定这是标准 SQL 还是 Microsoft 语法,但在 Microsoft SQL Server 中你可以这样做:
WITH PreSelect AS (
SELECT ACCEPTANCE_DATE FROM HUMAN_RESOURCES
UNION ALL
SELECT ACCEPTANCE_DATE FROM FINANCIAL_RESOURCES
UNION ALL
SELECT ACCEPTANCE_DATE FROM INFRASTRUCTURE_RESOURCES
)
SELECT COUNT(*) FROM PreSelect WHERE ACCEPTANCE_DATE = '2015-08-09';
或者如果您需要单独的每个值,则使用 TheDecks 建议的原点。
第二次尝试:
WITH PreSelect AS (
SELECT 'Infrastructure Resources' AS Origin, ACCEPTANCE_DATE FROM INFRASTRUCTURE_RESOURCES
UNION ALL
SELECT 'Human Resources' AS Origin, ACCEPTANCE_DATE FROM HUMAN_RESOURCES
UNION ALL
SELECT 'Financial Resources' AS Origin, ACCEPTANCE_DATE FROM FINANCIAL_RESOURCES
)
SELECT Origin, COUNT(*) FROM PreSelect
WHERE ACCEPTANCE_DATE = '2015-08-09'
GROUP BY Origin
ORDER BY 2 DESC;
本版不总结,提供口语标签,由大到小排序
是的,cte 是最好的选择...在 CTE 中,它使用结果中的 where 子句过滤数据(联合所有)
第三次尝试:
WITH PreSelect AS (
SELECT 'Infrastructure Resources' AS Origin, ACCEPTANCE_DATE FROM INFRASTRUCTURE_RESOURCES
UNION ALL
SELECT 'Human Resources' AS Origin, ACCEPTANCE_DATE FROM HUMAN_RESOURCES
UNION ALL
SELECT 'Financial Resources' AS Origin, ACCEPTANCE_DATE FROM FINANCIAL_RESOURCES
),
Categories AS (
SELECT DISTINCT Origin FROM PreSelect
),
ReferenceDate AS (
SELECT Origin, COUNT(*) RecordCount FROM PreSelect
WHERE ACCEPTANCE_DATE = '2015-08-09'
GROUP BY Origin
)
SELECT c.Origin, ISNULL(rd.RecordCount, 0) AS RecordCount FROM Categories c
LEFT OUTER JOIN ReferenceDate rd ON c.Origin = rd.Origin
ORDER BY 2 DESC;
这样也会出现包含 0 个条目的行...
如果您的问题是您只想定义 ACCEPTANCE_DATE
一次,那么您可以保留原来的 SQL 并使用宏或 SP 并将 ACCEPTANCE_DATE
参数化为输入值。
如果你想重写 SQL,也许可以试试这样:
SELECT MyCount FROM (
SELECT ACCEPTANCE_DATE, MyCount
FROM (
SELECT ACCEPTANCE_DATE, COUNT(*) AS MyCount
FROM MY_DATABASE.HUMAN_RESOURCES
GROUP BY ACCEPTANCE_DATE
)
UNION ALL
SELECT ACCEPTANCE_DATE, MyCount
FROM (
SELECT ACCEPTANCE_DATE, COUNT(*) AS MyCount
FROM MY_DATABASE.FINANCIAL_RESOURCES
GROUP BY ACCEPTANCE_DATE
)
UNION ALL
SELECT ACCEPTANCE_DATE, MyCount
FROM (
SELECT ACCEPTANCE_DATE, COUNT(*) AS MyCount
FROM MY_DATABASE.INFRASTRUCTURE_RESOURCES
GROUP BY ACCEPTANCE_DATE
)
) src
WHERE ACCEPTANCE_DATE = '2015-08-09';
如果您在这些表中有很多行,这可能不会很好地执行,除非您有一些优化,例如在 ACCEPTANCE_DATE
字段上定义的 PPI。
我没有对此进行测试,因此您可能会遇到一些语法错误需要解决,但它应该能满足您的需求。
您可以按照@ravioli 的建议使用宏:
REPLACE MACRO my_counts(inDate DATE) AS
(
SELECT 'HUMAN_RESOURCES' AS tab, Count(*)
FROM MY_DATABASE.HUMAN_RESOURCES
WHERE ACCEPTANCE_DATE=:inDate
UNION ALL
SELECT 'FINANCIAL_RESOURCES', Count(*)
FROM MY_DATABASE.FINANCIAL_RESOURCES
WHERE ACCEPTANCE_DATE=:inDate
UNION ALL
SELECT 'INFRASTRUCTURE_RESOURCES', Count(*)
FROM MY_DATABASE.INFRASTRUCTURE_RESOURCES
WHERE ACCEPTANCE_DATE=:inDate;
);
EXEC my_counts(DATE '2015-08-09');
在您拥有“创建宏”权限的数据库中或在您自己的用户中创建此宏(但除您之外没有其他人可以使用它)。
或者您使用通用Table表达式来定义日期:
WITH cte AS
(
SELECT DATE '2015-08-09' AS ACCEPTANCE_DATE
)
SELECT 'HUMAN_RESOURCES' AS tab, Count(*)
FROM MY_DATABASE.HUMAN_RESOURCES
WHERE ACCEPTANCE_DATE=(SELECT ACCEPTANCE_DATE FROM cte)
UNION ALL
SELECT 'FINANCIAL_RESOURCES', Count(*)
FROM MY_DATABASE.FINANCIAL_RESOURCES
WHERE ACCEPTANCE_DATE=(SELECT ACCEPTANCE_DATE FROM cte)
UNION ALL
SELECT 'INFRASTRUCTURE_RESOURCES', Count(*)
FROM MY_DATABASE.INFRASTRUCTURE_RESOURCES
WHERE ACCEPTANCE_DATE=(SELECT ACCEPTANCE_DATE FROM cte);
(SELECT ACCEPTANCE_DATE FROM cte)
将执行一次,然后作为参数传递给每个Select。