SQL:如果数据与使用JOIN不匹配,我希望它从不同的列返回值

SQL: where data doesn't match using JOIN, I want it to return values from different column

提问人:Jeevan 提问时间:7/4/2023 最后编辑:Jeevan 更新时间:7/4/2023 访问量:46

问:

我有 2 个表,我使用 LEFT JOIN 加入,即我从表 A 中获取 Name 并将其与表 B 中的名称匹配。有些记录不匹配并返回 null 值,因为它的格式不同。

现在我想做的是,只要它不匹配,我想从表 A 中提取名称中的第一个单词,然后在表 B 的名称中搜索它并返回这些值。

有人可以帮我实现这一目标吗?我举的例子如下:

表A:

名字
安联 游戏
测试
汽车公司

表B:

名字 类型
安联游戏有限公司 1
测试 2
汽车公司 3

我使用 LEFT JOIN 获得的输出:

A.名称 B.名称 类型
安联 游戏
测试 测试 2
汽车公司 汽车公司 3

我需要的输出:

A.名称 B.名称 类型
安联 游戏 安联游戏有限公司 1
测试 测试 2
汽车公司 汽车公司 3
SQL MySQL 联接 null 匹配

评论

0赞 SelVazi 7/4/2023
请编辑您的问题并添加一些简单的数据和预期的输出
0赞 Jeevan 7/4/2023
@SelVazi 我只是添加了一些示例

答:

0赞 Rob Eyre 7/4/2023 #1

您可以尝试两个连接 - 第一个使用完全匹配,第二个使用“LIKE”匹配,但前提是没有完全匹配:

SELECT
  a.Names AS 'A.Names',
  IFNULL(b_exact.Names, b_approx.Names) AS 'B.Names',
  IF(b_exact.Names IS NULL, b_approx.Type, b_exact.Type) AS 'Type'
FROM table_a a
LEFT JOIN table_b b_exact ON
  a.Names = b_exact.Names
LEFT JOIN table_b b_approx ON
  (b_exact.Names IS NULL AND b_approx.Names LIKE CONCAT(a.Names, '%'))

但是,您需要注意这一点,因为表 B 中可能存在多个匹配项。

0赞 Lajos Arpad 7/4/2023 #2

所以,你已经有一个

SELECT A.Names, B.Names, B.`Type`
FROM A
LEFT JOIN B
ON A.Names = B.Names

并且您成功地找到了完全匹配项。但是,如果第二个表包含第一个表,则您希望显示结果。您可以像这样获取所有记录:

SELECT A.Names, B.Names, B.`Type`
FROM A
LEFT JOIN B
ON A.Names = B.Names OR B.Names LIKE CONCAT('%', A.Names, '%')

但这将提供所有结果,如果您希望每个 A 有一个结果,那么您可以分组并聚合,如下所示:

SELECT A.Names,
       CASE
           WHEN MAX(A.Names = B.Names) > 0 THEN A.Names
           ELSE MIN(B.Names)
       END AS Names
       MAX(B.`Type`)
FROM A
LEFT JOIN B
ON A.Names = B.Names OR B.Names LIKE CONCAT('%', A.Names, '%')
GROUP BY A.Names

最后,如果要包括 A.Names 包含 B.Names 的情况,则可以将连接条件更改为

ON A.Names = B.Names OR B.Names LIKE CONCAT('%', A.Names, '%') OR A.Names LIKE CONCAT('%', B.Names, '%')