You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于非等值条件执行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存在两个问题:

  1. 缺少ON关键字,JOIN必须搭配ON指定连接条件
  2. 内容不是有效的布尔表达式,SQL要求连接条件必须返回真/假值

内容的提问来源于stack exchange,提问作者Greg-learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:03:36