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

SQLBase多表关联查询:实现工单单列多值按行输出求助

解决SQLBase中工单多值列拆分行的问题

嘿,我明白你现在的困境——用惯了MySQL,突然切换到SQLBase处理多表关联+列值拆分确实有点懵。刚好我之前处理过类似的场景,给你两种实用的解决方案,适配不同的SQLBase版本:

场景说明

先确认下你的需求:假设你的原始工单表(比如叫orders)中,productnr列是用分隔符(比如逗号)存储多个产品编号的单值字段,现在需要把这些多值拆分成单独的行,同时保留工单的其他关联信息(比如ordernr、type),最终得到你示例中那种一行一个产品编号的结果。


方法一:递归CTE(适合SQLBase 11.7及以上版本)

SQLBase从11.7开始支持递归公共表表达式(CTE),这是最简洁的拆分方式,和MySQL的递归逻辑类似:

WITH RECURSIVE split_products AS (
    -- 初始步骤:提取每个工单的第一个产品编号,同时保留剩余未拆分的部分
    SELECT 
        ordernr,
        type,
        TRIM(SUBSTRING_INDEX(productnr, ',', 1)) AS productnr,
        TRIM(SUBSTRING(productnr, LOCATE(',', productnr) + 1)) AS remaining_products
    FROM orders
    WHERE productnr IS NOT NULL AND productnr != ''
    
    UNION ALL
    
    -- 递归步骤:继续拆分剩余的产品编号,直到剩余部分为空
    SELECT 
        ordernr,
        type,
        TRIM(SUBSTRING_INDEX(remaining_products, ',', 1)) AS productnr,
        TRIM(SUBSTRING(remaining_products, LOCATE(',', remaining_products) + 1)) AS remaining_products
    FROM split_products
    WHERE remaining_products IS NOT NULL AND remaining_products != ''
)
-- 最终取出拆分后的所有行
SELECT ordernr, type, productnr
FROM split_products
ORDER BY ordernr, type;

补充:多表关联场景

如果需要和产品详情表(比如products)关联,只需要在最终查询里加入JOIN即可:

WITH RECURSIVE split_products AS (
    -- 同上递归逻辑...
    SELECT 
        ordernr,
        type,
        TRIM(SUBSTRING_INDEX(productnr, ',', 1)) AS productnr,
        TRIM(SUBSTRING(productnr, LOCATE(',', productnr) + 1)) AS remaining_products
    FROM orders
    WHERE productnr IS NOT NULL AND productnr != ''
    
    UNION ALL
    
    SELECT 
        ordernr,
        type,
        TRIM(SUBSTRING_INDEX(remaining_products, ',', 1)) AS productnr,
        TRIM(SUBSTRING(remaining_products, LOCATE(',', remaining_products) + 1)) AS remaining_products
    FROM split_products
    WHERE remaining_products IS NOT NULL AND remaining_products != ''
)
SELECT 
    sp.ordernr,
    sp.type,
    sp.productnr,
    p.product_name, -- 假设产品表有名称字段
    p.price         -- 假设产品表有价格字段
FROM split_products sp
JOIN products p ON sp.productnr = p.productnr
ORDER BY sp.ordernr, sp.type;

方法二:数字辅助表(适合低版本SQLBase)

如果你的SQLBase版本不支持递归CTE,可以用数字辅助表配合字符串函数来实现拆分:

第一步:创建数字表

先建一个包含连续数字的表(比如1到100,覆盖你工单中最多的产品数量):

CREATE TABLE numbers (n INT PRIMARY KEY);
-- 手动插入数字(如果数量多,也可以用SQLBase的存储过程循环插入)
INSERT INTO numbers VALUES (1),(2),(3),(4),(5),...,(100);

第二步:拆分查询

利用数字表来逐个提取每个位置的产品编号:

SELECT 
    o.ordernr,
    o.type,
    TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(o.productnr, ',', n.n), ',', -1)) AS productnr
FROM orders o
JOIN numbers n 
  ON n.n <= LENGTH(o.productnr) - LENGTH(REPLACE(o.productnr, ',', '')) + 1
WHERE o.productnr IS NOT NULL AND o.productnr != ''
ORDER BY o.ordernr, o.type, n.n;

原理说明

LENGTH(o.productnr) - LENGTH(REPLACE(o.productnr, ',', '')) + 1 用来计算当前工单的产品总数量,然后通过两次SUBSTRING_INDEX提取第n个位置的产品编号:第一次取前n个分隔的内容,第二次取最后一个,就得到了对应位置的产品。


注意事项

  • SQLBase的字符串函数(TRIM、LOCATE、SUBSTRING_INDEX)和MySQL的用法基本一致,但要确保你的版本支持这些函数;
  • 如果你的分隔符不是逗号,只需要把SQL中的逗号替换成实际的分隔符即可;
  • 拆分后如果需要去重,可以在最终查询里加上DISTINCT。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:24:41