将两个部分匹配的表连接到完全匹配

Posted

技术标签:

【中文标题】将两个部分匹配的表连接到完全匹配【英文标题】:Join two tables with a partial match to an exact match 【发布时间】:2019-03-01 07:14:33 【问题描述】:

我知道的令人困惑的标题。我正在尝试加入两个表:

表格:项目

+---------------+
|  ItemName     |
+---------------+
| "Banana"      |
| "~A Apple"    |
| "~B Orange"   |
| "Banana ~C"   |
| "Apple ~CC"   |
+---------------+

表:CODELOOKUP

+-------+------------+
| Code  | CodeResult |
+-------+------------+
| "~A"  | "One"      |
| "~B"  | "Two"      |
| "~C"  | "Three"    |
| "~CC" | "Four"     |
+-------+------------+

我希望加入这些表格,显示ITEM 表格中的所有项目,如果ItemName 包含"~" 后跟位于ItemName 任何位置的字母组合(但永远不会遇到另一个词 - 它总是在开头,结尾或中间有空格的多个单词的中间)我希望它与CodeResult 值相关。所以ItemName 中的PARTIAL MATCHCodeResult 中的EXACT MATCH

我设法得到以下代码:

SELECT ITEM.*, CODELOOKUP.CodeResult  
FROM ITEM LEFT JOIN CODELOOKUP ON INSTR(ITEM.ItemName, CODELOOKUP.Code)  

这几乎返回了我所追求的,唯一的问题是它返回了 "Apple ~CC" 行两次:

+-------------+---------+
| "Banana"    | ""      |
| "~A Apple"  | "One"   |
| "~B Orange" | "Two"   |
| "Banana ~C" | "Three" |
| "Apple ~CC" | "Three" |
| "Apple ~CC" | "Four"  |
+-------------+---------+

...它应该只返回与"Four" 完全匹配的行,例如:

+-------------+---------+
| "Banana"    | ""      |
| "~A Apple"  | "One"   |
| "~B Orange" | "Two"   |
| "Banana ~C" | "Three" |
| "Apple ~CC" | "Four"  |
+-------------+---------+

有什么方法可以让它工作?

谢谢

【问题讨论】:

【参考方案1】:

您只能在部分匹配项上加入空格,并在字符串末尾附加一个空格,以避免~C 匹配~CC

SELECT ITEM.*, CODELOOKUP.CodeResult
FROM ITEM LEFT JOIN CODELOOKUP ON INSTR(ITEM.ItemName & " ",CODELOOKUP.Code & " ") 

【讨论】:

以上是关于将两个部分匹配的表连接到完全匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有前缀列的表连接到 PHP MySQL 或 Laravel 中的另外两个表

一张图看懂Mysql的join连接

如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回

如何将两个事实表连接到一维表

Hibernate:如何在注释中将三个 3 表连接到一个连接表中?

使用 RIGHT JOINT 将两个表连接到一个 datagridview