ClickHouse进行LEFT JOIN 关联查询时, 关联键的数据类型不一致,导致报错 的解决方案详解

news2025/4/23 11:11:55

一.场景

使用golang语言操作ClickHouse数据库进行LEFT JOIN关联查询查询计算:  关联键在不同数据表中的数据类型不一致, 这样SQL语句就会报错,

二.问题

通过上面场景描述, 下面贴出具体的sql语句相关:

  • 表user_phone_bind:
    • 字段UserId(用户id): 类型Int64
    • 字段Phone(手机号): 类型String
  • 表user_order:
    • 字段UserId(用户id): 类型UInt64
    • 字段OrderId(订单id): 类型UInt64
    • 字段OrderNo(订单号): 

现在需要查询user_order表中的订单号,以及对应用户当前绑定的手机号,这里通过LEFT JOIN 进行连接查询, 对应的sql语句如下:

// 查询订单表订单信息(订单号),以及用户最新绑定的手机号
SELECT OrderNo, user_bind_phone.Phone AS phone FROM user_order LEFT JOIN (SELECT (UserId,argMax(Phone, CreatedAt) AS phone FROM user_bind_phone GROUP BY UserId) ON user_order.UserId = user_bind_phone.UserId

// 对上述sql语句说明: 
// 查询用户订单编号,以及用户绑定的手机号, 这里使用LEFT JOIN 连接,查询user_bind_phone中用户的手机号,argMax(Phone, CreatedAt) 表示返回最大值CreatedAt(也就是最新一条)的Phone记录, 这里user_order与user_bind_phone表通过UserId进行关联 
	

通过执行上面sql语句,报如下错误:

message: Can't infer common type for joined columns: UserId: UInt64 at left, bupb.UserId: Int64 at right. There is no supertype for types UInt64, Int64 because some of them are signed integers and some are unsigned integers, but there is no signed integer type, that can exactly represent all required unsigned integer values"

三.错误原因

在使用 ClickHouse 进行表连接(JOIN)时出现的,主要是因为连接的两个表中对应的列类型不匹配

四.错误分析

  • 列类型不一致: 
    • 当前错误信息中提到的 UserId 列在左侧表的类型是 UInt64(无符号 64 位整数),而在右侧表的类型是 Int64(有符号 64 位整数)
    • UInt64 可以存储更大的非负整数,而 Int64 可以存储正负整数。由于它们的类型不同,ClickHouse 无法推断出一个共同的类型来进行连接
  • 类型不兼容
    • ​​​​​​​由于无符号整数和有符号整数之间没有一个可以涵盖所有值的共同类型,因此引发了这个错误

五.解决方案

1.类型转换

在连接查询中可以使用类型转换函数将 UserId 列的类型进行转换,以使两者类型一致,可以将 Int64 转换为 UInt64,或者将 UInt64 转换为 Int64,具体取决于各自数据特性和需求,eg:

// 方法1: 将 Int64 转换为 UInt64
SELECT OrderNo, user_bind_phone.Phone AS phone FROM user_order LEFT JOIN (SELECT (UserId,argMax(Phone, CreatedAt) AS phone FROM user_bind_phone GROUP BY UserId) ON user_order.UserId = CAST(user_bind_phone.UserId AS UInt64)

// 方法2: 将 UInt64 转换为 Int64
SELECT OrderNo, user_bind_phone.Phone AS phone FROM user_order LEFT JOIN (SELECT (UserId,argMax(Phone, CreatedAt) AS phone FROM user_bind_phone GROUP BY UserId) ON CAST(user_order.UserId AS Int64) = user_bind_phone.UserId

// 方法3: 在Select中进行CAST处理
SELECT OrderNo, user_bind_phone.Phone AS phone FROM user_order LEFT JOIN (SELECT ((CAST(UserId AS UInt64)) AS UserId,argMax(Phone, CreatedAt) AS phone FROM user_bind_phone GROUP BY UserId) ON user_order.UserId = user_bind_phone.UserId

2.检查数据范围

在进行类型转换前,请确保数据在转换后不会导致溢出或数据丢失。例如,UInt64 的范围是 0 到 18,446,744,073,709,551,615,而 Int64 的范围是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。因此,如果您将 UInt64 转换为 Int64,请确保数据不会超出 Int64 的正值范围 

3.调整数据模型

如果可能,考虑在数据模型设计时统一使用同一种类型(例如,统一使用 UInt64 或 Int64),以减少此类类型不匹配的问题 

六.总结

在 ClickHouse 中,当进行表连接时,确保连接的列类型一致是非常重要的。如果您遇到列类型不匹配的错误,可以通过类型转换来解决。选择合适的转换方式并确保数据的范围是关键步骤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLM中什么是模板定义、提示工程和文档处理链

LLM中什么是模板定义、提示工程和文档处理链 定义提示模板(prompt_template):prompt_template = """Use the following pieces of context to answer the question at the end. If you dont know the answer, just say that you dont know, dont try to make…

密码学(二)流密码

2.1流密码的基本概念 流密码的基本思想是利用密钥 k 产生一个密钥流...,并使用如下规则对明文串 ... 加密:。密钥流由密钥流发生器产生: ,这里是加密器中的记忆元件(存储器)在时刻 i 的状态&#xff0c…

力扣第446场周赛

有事没赶上, 赛后模拟了一下, 分享一下我的解题思路和做题感受 1.执行指令后的得分 题目链接如下:力扣 给你两个数组:instructions 和 values,数组的长度均为 n。 你需要根据以下规则模拟一个过程: 从下标 i 0 的第一个指令开…

OpenCV中的透视变换方法详解

文章目录 引言1. 什么是透视变换2. 透视变换的数学原理3. OpenCV中的透视变换代码实现3.1 首先定义四个函数 3.1.1 cv_show() 函数 3.1.2 def resize() 函数 3.1.3 order_points() 函数 3.1.4 four_point_transform() 函数 3.2 读取图片并做预处理3.3 轮廓检测3.4 获取最大…

并发设计模式实战系列(3):工作队列

🌟 ​大家好,我是摘星!​ 🌟 今天为大家带来的是并发设计模式实战系列,第三章工作队列(Work Queue)​​,废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 生产者-消费者架构 …

如何理解抽象且不易理解的华为云 API?

API的概念在华为云的使用中非常抽象,且不容易理解,用通俗的语言 形象的比喻来讲清楚——什么是华为云 API,怎么用,背后原理,以及主要元素有哪些,尽量让新手也能明白。 🧠 一句话先理解&#xf…

深度学习-全连接神经网络(过拟合,欠拟合。批量标准化)

七、过拟合与欠拟合 在训练深层神经网络时,由于模型参数较多,在数据量不足时很容易过拟合。而正则化技术主要就是用于防止过拟合,提升模型的泛化能力(对新数据表现良好)和鲁棒性(对异常数据表现良好)。 1. 概念认知 …

系统架构设计师:流水线技术相关知识点、记忆卡片、多同类型练习题、答案与解析

流水线记忆要点‌ ‌公式 总时间 (n k - 1)Δt 吞吐率 TP n / 总时间 → 1/Δt(max) 加速比 S nk / (n k - 1) | 效率 E n / (n k - 1) 关键概念 周期:最长段Δt 冲突‌: ‌数据冲突(RAW) → 旁路/…

复刻低成本机械臂 SO-ARM100 3D 打印篇

视频讲解: 复刻低成本机械臂 SO-ARM100 3D 打印篇 清理了下许久不用的3D打印机,挤出机也裂了,更换了喷嘴和挤出机夹具,终于恢复了正常工作的状态,接下来还是要用起来,不然吃灰生锈了,于是乎想起…

Flutter IOS 真机 Widget 错误。Widget 安装后系统中没有

错误信息: SendProcessControlEvent:toPid: encountered an error: Error Domaincom.apple.dt.deviceprocesscontrolservice Code8 "Failed to show Widget com.xxx.xxx.ServerStatus error: Error DomainFBSOpenApplicationServiceErrorDomain Code1 "T…

Spring之我见 - Spring MVC重要组件和基本流程

核心组件详解 前端控制器 - DispatcherServlet 作用:所有请求的入口,负责请求分发和协调组件。 public class DispatcherServlet extends HttpServlet {// 核心服务方法protected void doService(HttpServletRequest request, HttpServletResponse re…

使用 Axios 进行 API 请求与接口封装:打造高效稳定的前端数据交互

引言 在现代前端开发中,与后端 API 进行数据交互是一项核心任务。Axios 作为一个基于 Promise 的 HTTP 客户端,以其简洁易用、功能强大的特点,成为了前端开发者处理 API 请求的首选工具。本文将深入探讨如何使用 Axios 进行 API 请求&#x…

理解字符设备、设备模型与子系统:以 i.MX8MP 平台为例

视频教程请关注 B 站:“嵌入式 Jerry” Linux 内核驱动开发中,很多人在接触字符设备(char device)、设备模型(device model)和各种子系统(subsystem)时,往往会感到概念混…

鸿蒙Flutter仓库停止更新?

停止更新 熟悉 Flutter 鸿蒙开发的小伙伴应该知道,Flutter 3.7.12 鸿蒙化 SDK 已经在开源鸿蒙社区发布快一年了, Flutter 3.22.x 的鸿蒙化适配一直由鸿蒙突击队仓库提供,最近有小伙伴反馈已经 2 个多月没有停止更新了,不少人以为停…

网络基础概念(下)

网络基础概念(上)https://blog.csdn.net/Small_entreprene/article/details/147261091?sharetypeblogdetail&sharerId147261091&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link 网络传输的基本流程 局域网网络传输流…

一个关于相对速度的假想的故事-4

回到公式, 正写速度叠加和倒写速度叠加的倒写相等,这就是这个表达式所要表达的意思。但倒写叠加用的是减法,而正写叠加用的是加法。当然是这样,因为正写叠加要的是单位时间上完成更远的距离,而倒写叠加说的是单位距离需…

Idea创建项目的搭建方式

目录 一、普通Java项目 二、普通JavaWeb项目 三、maven的JavaWeb项目 四、maven的Java项目 一、普通Java项目 1. 点击 Create New Project 2. 选择Java项目,选择JDK,点击Next 3. 输入项目名称(驼峰式命名法),可选…

【DeepSeek 学习推理】Llumnix: Dynamic Scheduling for Large Language Model Serving实验部分

6.1 实验设置 测试平台。我们使用阿里云上的16-GPU集群(包含4个GPU虚拟机,类型为ecs.gn7i-c32g1.32xlarge)。每台虚拟机配备4个NVIDIA A10(24 GB)GPU(通过PCI-e 4.0连接)、128个vCPU、752 GB内…

Kubernetes相关的名词解释kubeadm(19)

kubeadm是什么? kubeadm 是 Kubernetes 官方提供的一个用于快速部署和管理 Kubernetes 集群的命令行工具。它简化了集群的初始化、节点加入和升级过程,特别适合在生产环境或学习环境中快速搭建符合最佳实践的 Kubernetes 集群。 kubeadm 的定位 不是完整…

什么是负载均衡?NGINX是如何实现负载均衡的?

大家好,我是锋哥。今天分享关于【什么是负载均衡?NGINX是如何实现负载均衡的?】面试题。希望对大家有帮助; 什么是负载均衡?NGINX是如何实现负载均衡的? 1000道 互联网大厂Java工程师 精选面试题-Java资源…