SQL LEFT JOIN 与部分字符串匹配

Posted

技术标签:

【中文标题】SQL LEFT JOIN 与部分字符串匹配【英文标题】:SQL LEFT JOIN with partial string match 【发布时间】:2021-03-02 07:53:42 【问题描述】:

我想根据部分字符串匹配进行左连接。

我正在查找的字段 (REC_LIST)(通常)仅包含 1 个发票编号。但有时,字段中会列出多个数字。

因此,我尝试做这样的事情,只要找到我的匹配项,不管该领域还有什么:

SELECT DAB700.DATUM,DAB700.BELEG_ART, DAB700.BELEG_NR, DAB050.ANUMMER
FROM "DAB700.ADT" DAB700
left join "DAB050.ADT" DAB050 on DAB700.BELEG_NR LIKE '%'+DAB050.REC_LIST+'%'
WHERE DAB700.BELEG_NR = '337847'

在这个例子中,我强制它找到一个特定的项目,只是为了检查错误。问题是,它给了我左表 - 但没有找到任何匹配项(尽管我知道它存在)。

我的代码正确吗?还有其他方法可以实现吗?

REC_LIST 示例:

【问题讨论】:

你可以试试这个 LIKE CONCAT('%',DAB050.REC_LIST, '%') 嗯我收到错误:标量函数的参数无效:CONCAT 共享表格和预期输出的样本数据 尝试使用LIKE '%'DAB050.REC_LIST'%'而不是LIKE '%'+DAB050.REC_LIST+'%' 您应该考虑规范化 REC_LIST 列。无法优化诸如此类的通配符匹配。这意味着必须对 DAB700 和 DAB050 的笛卡尔连接的每一行进行评估。如果表的大小合理,则这种类型的连接将无法正常工作。 【参考方案1】:

试试这个查询

SELECT DAB700.DATUM,DAB700.BELEG_ART, DAB700.BELEG_NR, DAB050.ANUMMER
FROM "DAB700.ADT" DAB700, "DAB050.ADT" DAB050
WHERE DAB700.BELEG_NR = '337847' AND DAB700.BELEG_NR LIKE '%' + DAB050.REC_LIST + '%'

【讨论】:

您好,感谢您的尝试 - 但这会返回 0 行,没有数据。最后,也许我会做点别的事情——但这对我来说仍然是一个有趣的挑战。必须有解决方案,即使效率不高! 您的代码也是正确的。我认为你在数据库中请求的数据不符合条件【参考方案2】:

我认为你的比较是倒退的:

SELECT DAB700.DATUM,DAB700.BELEG_ART, DAB700.BELEG_NR, DAB050.ANUMMER
FROM "DAB700.ADT" DAB700 LEFT JOIN
     "DAB050.ADT" DAB050 
     ON DAB050.REC_LIST LIKE '%' + DAB700.BELEG_NR + '%'
WHERE DAB700.BELEG_NR = '337847';

“更大的东西”(即“列表”)位于LIKE 之前。 “较小的东西”(即特定值)是模式的一部分。

【讨论】:

感谢您指出逻辑问题。但还是不行。我认为 LIKE '%'+ ... 是问题所在。我们要查找的字段是文本还是值有关系吗? @egg 。 . .如果BELEG_NR 不是字符串,则+ 是加法。您可以改用CONCAT()

以上是关于SQL LEFT JOIN 与部分字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章

sql中left join、right join、inner join有啥区别

dplyr:inner_join 与部分字符串匹配

dplyr:inner_join 与部分字符串匹配

MS Access INNER JOIN/LEFT JOIN 问题

INNER JOIN LEFT JOIN RIGHT JOIN 的区别

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)