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

单元格含多值的两张数据表SQL关联查询实现方案问询

解决方案

核心思路

因为Table1的关联列存储了多个分隔开的值,无法直接和Table2的单值关联列匹配,所以需要先将Table1的多值列拆分为一行对应单个关联值的结构,再执行关联查询。

不同数据库的实现写法

1. MySQL 8.0+ / MariaDB

WITH RECURSIVE split_vals AS (
    -- 递归拆分多值列,假设关联列名为join_col,分隔符为英文逗号
    SELECT 
        t1.*,
        1 AS pos,
        SUBSTRING_INDEX(t1.join_col, ',', 1) AS single_join_val,
        SUBSTRING(join_col, LENGTH(SUBSTRING_INDEX(t1.join_col, ',', 1)) + 2) AS remaining
    FROM Table1 t1
    UNION ALL
    SELECT 
        sv.*,
        pos + 1,
        SUBSTRING_INDEX(sv.remaining, ',', 1),
        SUBSTRING(sv.remaining, LENGTH(SUBSTRING_INDEX(sv.remaining, ',', 1)) + 2)
    FROM split_vals sv
    WHERE sv.remaining <> ''
)
-- 拆分后关联Table2,输出需要的字段
SELECT sv.*, t2.*
FROM split_vals sv
INNER JOIN Table2 t2 ON sv.single_join_val = t2.join_col
-- 按原Table1的主键排序即可得到符合预期的结果
ORDER BY sv.id, sv.pos;

2. PostgreSQL

-- 用string_to_table直接拆分多值列,unnest转为行
SELECT t1.*, t2.*
FROM Table1 t1,
     unnest(string_to_array(t1.join_col, ',')) AS single_join_val
INNER JOIN Table2 t2 ON single_join_val = t2.join_col
ORDER BY t1.id;

3. Oracle 12c+

SELECT t1.*, t2.*
FROM Table1 t1
CROSS APPLY (
    SELECT REGEXP_SUBSTR(t1.join_col, '[^,]+', 1, LEVEL) AS single_join_val
    FROM DUAL
    CONNECT BY REGEXP_SUBSTR(t1.join_col, '[^,]+', 1, LEVEL) IS NOT NULL
) sv
INNER JOIN Table2 t2 ON sv.single_join_val = t2.join_col
ORDER BY t1.id;

注意事项

  • 上述代码默认多值列的分隔符为英文逗号,如果你实际场景用的是其他分隔符(比如分号、竖线),替换代码中对应的分隔符即可
  • 如果你的数据库不支持CTE/递归语法,可以提前对Table1做数据清洗,把多值列拆分为单值的中间表再做关联

内容的提问来源于stack exchange,提问作者Kritika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:57:00