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有啥区别
MS Access INNER JOIN/LEFT JOIN 问题
INNER JOIN LEFT JOIN RIGHT JOIN 的区别
SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)