创建一个用其他表的记录计数填充的表

Posted

技术标签:

【中文标题】创建一个用其他表的记录计数填充的表【英文标题】:Creating a table populated with record counts from other tables 【发布时间】:2020-07-17 17:16:32 【问题描述】:

我想验证 2 个(或更多)表每天的计数相同。我认为对每个表执行 SELECT 计数并将它们报告为临时表中它们自己的命名列中的值会很有效,即使只是观察结果窗口中的数字

  CREATE TABLE #sync_count (mst_cnt AS varchar(5), info_cnt AS varchar(5));
    INSERT INTO #sync_count (mst_cnt, info_cnt)
    VALUES (
    SELECT Sum(SRV_MST.SRV_MACID) AS mst_cnt FROM SRV_MST,
    SELECT Sum(SRV_INFO.SRV_MACID) AS info_cnt FROM SRV_INFO,
    ))

DELETE #sync_count

期望的输出

SRV_MST | SRV_INFO
===================
  22    | 22
===================

不确定我到底哪里出错了。有小费吗?非常感谢

【问题讨论】:

Oracle 不支持表名中的#,所以我去掉了 PL/SQL 标签。 【参考方案1】:

子查询需要括号:

CREATE TABLE #sync_count (mst_cnt varchar(5), info_cnt varchar(5));
----------------------------------^ as is not used in table declarations.

INSERT INTO #sync_count (mst_cnt, info_cnt)
    VALUES ( (SELECT Sum(SRV_MST.SRV_MACID) AS mst_cnt FROM SRV_MST),
             (SELECT Sum(SRV_INFO.SRV_MACID) AS info_cnt FROM SRV_INFO)
           );

最后一个括号前还有一个逗号。

我强烈、强烈、强烈建议您将计数定义为 numbers 而不是 string

CREATE TABLE #sync_count (mst_cnt int, info_cnt int);

其实你可以不用表声明,直接使用:

SELECT (SELECT Sum(SRV_MST.SRV_MACID) FROM SRV_MST) AS mst_cnt,
       (SELECT Sum(SRV_INFO.SRV_MACID) FROM SRV_INFO) AS info_cnt 
INTO #sync_count ;

【讨论】:

这非常有效。我确实必须将 sum 更改为 COUNT,因为 SQL 抱怨 sum 操作数的类型不正确。再次感谢!【参考方案2】:

你可以这样写:

INSERT INTO #sync_count (mst_cnt, info_cnt)
SELECT
    (SELECT Sum(SRV_MST.SRV_MACID) FROM SRV_MST),
    (SELECT Sum(SRV_INFO.SRV_MACID) FROM SRV_INFO)

【讨论】:

以上是关于创建一个用其他表的记录计数填充的表的主要内容,如果未能解决你的问题,请参考以下文章

创建列类型为 RECORD 的表

使用带有 postgresql 表的 vba 填充组合框访问 2007

PL/SQL - 声明带有由其他游标填充的表的游标时出错

按日期获取表的所有先前记录 MySQL

创建缺少键值数据记录的视图

ABAP 中内表的复制