如何用CASE WHEN在表B新建列标识表A数据 执行SQL报套接字错误
问题描述
需要实现的逻辑为:通过CASE WHEN语句在查询表B时新增一列,标识每条记录的acct_key是否同时存在于表A中。编写SQL执行后返回连接类错误,未得到预期结果。
原SQL代码
select acct_key, (case when acct_key in ( select acct_key from table_A ) then 1 else 0 end) as acct_indicator from table_B;
报错详情
- 执行模式:单语句模式执行
- 报错码:
804 : 08S01 - 错误提示:数据包传输套接字通信失败
- 报错时间:CDT(美国中部夏令时)2022年5月25日12:01:18
- 异常信息:抛出
java.net.SocketException: Software caused connection abort: socket write error异常,错误日志包含套接字源地址、目标地址、连接配置参数等信息,后续堆栈跟踪信息截断。
根因分析
该报错不属于SQL语法错误,核心原因是IN (关联子查询)的写法在表A数据量较大时执行效率极低,查询长时间运行无返回,触发数据库连接超时阈值,服务端主动断开连接,最终客户端抛出套接字写入失败的异常。
优化实现
用LEFT JOIN关联替代IN子查询写法,可大幅提升查询执行效率,避免超时断连:
SELECT b.acct_key, CASE WHEN a.acct_key IS NOT NULL THEN 1 ELSE 0 END AS acct_indicator FROM table_B b LEFT JOIN (SELECT DISTINCT acct_key FROM table_A) a ON b.acct_key = a.acct_key;
- 如果表A的
acct_key是无重复的主键/唯一键,可去掉子查询中的DISTINCT,直接关联table_A原表,执行效率会更高。 - 如果替换写法后仍然出现同类套接字报错,需要逐一排查:数据库服务运行状态、客户端与数据库间网络是否存在丢包/防火墙拦截、数据库连接超时参数配置是否过短。
内容的提问来源于stack exchange,提问作者Yumeng Xu
相关产品推荐
相关产品推荐

