AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 174053
Accepted
Ebony Maw
Ebony Maw
Asked: 2017-05-20 08:36:29 +0800 CST2017-05-20 08:36:29 +0800 CST 2017-05-20 08:36:29 +0800 CST

尝试合并这两个查询时,如何纠正“发生算术溢出错误”?

  • 772

让我们考虑第一个查询:

SELECT r.cnum as cnum, c.name as name, r.assets as assets
FROM research..complex c, research..retirement_simple_ira r
where r.date = '9/30/2016'
and c.cnum = r.cnum
ORDER BY cnum

这给了我们一个结果集,如下所示:

在此处输入图像描述

这是我的第二个查询:

SELECT cf.cnum, SUM(rs.dh_simple + rs.ha_simple) as sums
FROM retirement_survey as rs
INNER JOIN currentfunds as cf
ON rs.fundid = cf.fundid
WHERE rs.date  = '9/30/2016'
GROUP BY cf.cnum
HAVING SUM(rs.dh_simple + rs.ha_simple) > 0

在此处输入图像描述

我尝试合并这两个查询,以便得到一个列出 4 列的结果集:

数字 | 姓名 | 资产 | 总和

这是我的尝试:

SELECT cf.cnum as cnum, c.name as name, r.assets as assets, SUM(rs.dh_simple + rs.ha_simple) as sums
FROM research..complex c, research..retirement_simple_ira r, retirement_survey as rs
INNER JOIN currentfunds as cf
ON rs.fundid = cf.fundid
WHERE rs.date = '9/30/2016'
HAVING SUM(rs.dh_simple + rs.ha_simple) > 0

那就是我收到错误的时候。我做错了什么?

sql-server sybase
  • 3 3 个回答
  • 2763 Views

3 个回答

  • Voted
  1. markp-fuso
    2017-05-26T09:11:20+08:002017-05-26T09:11:20+08:00

    FWIW ...如果您(仍然)不确定为什么原始(组合)查询会产生溢出错误...请考虑:

    • c 和 r 表之间缺少连接子句 (c.cnum = r.cnum)
    • c 和 cf 表 (c.cnum = cf.cnum)或r 和 cf 表 (r.cnum = cf.cnum)之间缺少连接子句
    • 缺少“分组依据”子句

    缺少连接子句意味着您的查询在 c/r/cf 表之间生成笛卡尔积(即,生成的连接记录比您想要的要多得多)。

    缺少的 'group by' 子句意味着 sum() 被应用于大量(笛卡尔积)连接记录;并且正如 Henrico 所建议的那样, sum() 认为它正在使用整数数据类型,因此 sum() 结果被假定为整数;Sybase 的整数数据类型的最大值为 2B,因此当 sum()(没有“分组依据”;应用于大规模笛卡尔积)达到 2B 以上时,您会得到溢出错误。

    您的最新查询包括第一次尝试中缺少的那些部分(联接、“分组依据”),因此您不再生成溢出错误。(“呃,马克!”?)

    • 3
  2. Henrico Bekker
    2017-05-20T08:43:16+08:002017-05-20T08:43:16+08:00

    我怀疑您的 SUM(rs.dh_simple + rs.ha_simple) 是 INT,在进行 SUM 之前尝试将两者都转换为 BIGINT/FLOAT/DECIMAL。

    INT 最大大小 = 2,147,483,647

    但来自 MS 的警告:当您使用 +、-、*、/ 或 % 算术运算符执行 int、smallint、tinyint 或 bigint 常量值到浮点、实数、小数或数字数据类型的隐式或显式转换时, SQL Server 在计算表达式结果的数据类型和精度时应用的规则取决于查询是否自动参数化。

    尝试:

    SELECT 
    cf.cnum as cnum, 
    c.name as name, 
    r.assets as assets, 
    SUM(CAST(rs.dh_simple as BIGINT) + CAST(rs.ha_simple as BIGINT)) as sums
    FROM research..complex c, research..retirement_simple_ira r, retirement_survey as rs
    INNER JOIN currentfunds as cf
    ON rs.fundid = cf.fundid
    WHERE rs.date = '9/30/2016'
    GROUP BY cf,num, c.name, r.assets
    HAVING SUM(CAST(rs.dh_simple as BIGINT) + CAST(rs.ha_simple as BIGINT)) > 0
    
    • 2
  3. Best Answer
    Ebony Maw
    2017-05-20T10:13:09+08:002017-05-20T10:13:09+08:00

    经过大量的试验和错误,这似乎终于奏效了!

    SELECT r.cnum as cnum, c.name as name, r.assets as assets, SUM(rs.dh_simple + rs.ha_simple) as sums
      FROM research..complex c, research..retirement_simple_ira r, currentfunds cf, retirement_survey rs
    WHERE  
    c.cnum = r.cnum
    AND r.cnum = cf.cnum
    AND cf.fundid = rs.fundid
    AND r.date = '9/30/2016'
    GROUP BY r.cnum, c.name, r.assets
    ORDER BY 1
    

    虽然它非常慢,并且需要索引,因为其中一个表实际上是一个视图......但现在应该可以工作了:)

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve