如何基于非等值条件执行SQL JOIN操作?
基于非等值条件实现SQL JOIN的方案
针对你遇到的表B中ID字段包含多个用“ -- ”分隔值的情况,可以通过以下方法实现两表连接:
通用方案(适配多数数据库)
利用字符串匹配逻辑,覆盖表B中ID的三种情况(单个匹配、表A的ID在前、表A的ID在后):
SELECT * FROM 表A a LEFT JOIN 表B b ON b.ID = a.ID OR b.ID LIKE CONCAT(a.ID, ' -- %') OR b.ID LIKE CONCAT('% -- ', a.ID)
这个条件会匹配:
- 表B的ID和表A的ID完全相等的记录
- 表B的ID以
[表A.ID] --开头的记录(比如ID5234 -- ID7562匹配表A的ID5234) - 表B的ID以
-- [表A.ID]结尾的记录(比如ID7562 -- ID5234匹配表A的ID5234)
更精准的数据库专属方案
如果你的数据库支持字符串拆分函数,可以避免部分ID误匹配的潜在问题(比如ID123误匹配ID1234 -- ID567):
MySQL/MariaDB
使用SUBSTRING_INDEX拆分分隔后的ID值:
SELECT * FROM 表A a LEFT JOIN 表B b ON b.ID = a.ID OR SUBSTRING_INDEX(b.ID, ' -- ', 1) = a.ID OR SUBSTRING_INDEX(b.ID, ' -- ', -1) = a.ID
SQL Server
使用STRING_SPLIT拆分后匹配:
SELECT * FROM 表A a LEFT JOIN 表B b ON b.ID = a.ID OR EXISTS ( SELECT 1 FROM STRING_SPLIT(b.ID, ' -- ') WHERE value = a.ID )
PostgreSQL
使用STRING_TO_ARRAY拆分后匹配:
SELECT * FROM 表A a LEFT JOIN 表B b ON b.ID = a.ID OR a.ID = ANY(STRING_TO_ARRAY(b.ID, ' -- '))
关于你之前的错误语句
你写的LEFT JOIN ID1 -- ID2存在两个问题:
- 缺少
ON关键字,JOIN必须搭配ON指定连接条件 - 内容不是有效的布尔表达式,SQL要求连接条件必须返回真/假值
内容的提问来源于stack exchange,提问作者Greg-learner
相关产品推荐
相关产品推荐

