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

使用LIKE关联SQL表出现重复数据,求正确关联方案

解决Table1与Table2文件名关联重复的SQL方案

问题根源

你之前用LIKE关联时出现重复,是因为模糊匹配没有限制前缀的完整性:比如abc会匹配abc_20230101,而abc_TR也会因为包含abc字符串,错误匹配到abc_20230101(反过来如果有abc_TR_20230101,abc也会匹配它),导致重复数据。

可行SQL脚本

方案1:精确前缀匹配(适用于Table1.FileName不含下划线的场景)

通过强制Table2的文件名以Table1的文件名开头,且紧跟下划线+8位数字日期,确保匹配的唯一性:

-- SQL Server版本
SELECT t1.FileName, t2.TimeSentIn
FROM Table1 t1
INNER JOIN Table2 t2 
    ON t2.FileName LIKE CONCAT(t1.FileName, '_%')
    -- 验证下划线后的8位是数字日期(YYYYMMDD格式)
    AND SUBSTRING(t2.FileName, LEN(t1.FileName) + 2, 8) LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

方案2:提取文件名前缀精确匹配(通用场景,支持Table1.FileName含下划线)

提取Table2文件名中第一个下划线前的部分,与Table1的FileName完全相等,同时验证后缀是有效日期:

-- SQL Server版本
SELECT t1.FileName, t2.TimeSentIn
FROM Table1 t1
INNER JOIN Table2 t2 
    ON LEFT(t2.FileName, CHARINDEX('_', t2.FileName) - 1) = t1.FileName
    -- 验证下划线后的8位是有效日期
    AND ISDATE(SUBSTRING(t2.FileName, CHARINDEX('_', t2.FileName) + 1, 8)) = 1

适配MySQL版本

如果使用MySQL,替换对应的字符串函数:

-- MySQL版本
SELECT t1.FileName, t2.TimeSentIn
FROM Table1 t1
INNER JOIN Table2 t2 
    ON LEFT(t2.FileName, INSTR(t2.FileName, '_') - 1) = t1.FileName
    -- 验证后缀是有效YYYYMMDD格式日期
    AND STR_TO_DATE(SUBSTRING(t2.FileName, INSTR(t2.FileName, '_') + 1, 8), '%Y%m%d') IS NOT NULL

补充:筛选唯一匹配记录

如果Table2中存在同一个Table1.FileName对应多条日期记录,可添加窗口函数筛选最新/最早的TimeSentIn:

-- SQL Server示例:取每个FileName的最新TimeSentIn
WITH RankedData AS (
    SELECT 
        t1.FileName, 
        t2.TimeSentIn,
        ROW_NUMBER() OVER (PARTITION BY t1.FileName ORDER BY t2.TimeSentIn DESC) AS rn
    FROM Table1 t1
    INNER JOIN Table2 t2 
        ON LEFT(t2.FileName, CHARINDEX('_', t2.FileName) - 1) = t1.FileName
        AND ISDATE(SUBSTRING(t2.FileName, CHARINDEX('_', t2.FileName) + 1, 8)) = 1
)
SELECT FileName, TimeSentIn
FROM RankedData
WHERE rn = 1;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:36:26