提问人:Jeevan 提问时间:7/4/2023 最后编辑:Jeevan 更新时间:7/4/2023 访问量:46
SQL:如果数据与使用JOIN不匹配,我希望它从不同的列返回值
SQL: where data doesn't match using JOIN, I want it to return values from different column
问:
我有 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 |
答:
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, '%')
评论