![](/img/trans.png)
[英]How to select rows with LEFT JOIN if specified value exists in joined table?
[英]How to select rows from second join table which can be joined on either of 2 columns depending on length of source column value
我有一个查找表,其中包含名称和对应的 2 个不同代码,一个 9 位代码和一个 11 个字符的字母数字代码。 根据用户在输入时选择的内容,可以根据给出的 2 个代码中的任何一个来搜索行。 因此,根据用户输入的是 9 位代码还是 11 位字母数字代码,我必须加入查找表并准确获取名称。
这是表格的示例
数据表
+-----------+------------+
| code | other cols |
+-----------+------------+
|112111213 | ... |
|ABCD112233X| ... |
| | |
+-----------+------------+
查找表
+---------+-----------+------------+
|code1 |code2 |name |
+---------+-----------+------------+
|112111213|XXXX111111Z|Name 1 |
|000000000|ABCD112233X|Name 2 |
| | | |
+---------+-----------+------------+
我怎样才能得到如下结果
+-----------+------------+
| code | name |
+-----------+------------+
|112111213 | Name 1 |
|ABCD112233X| Name 2 |
| | |
+-----------+------------+
假设只有code1
或code2
在连接中匹配,您可以尝试使用 OR 逻辑连接:
UPDATE Data d
INNER JOIN Lookup l
ON d.code = l.code1 OR d.code = l.code2
SET
d.name = l.name;
请注意,连接条件中OR
的存在可能意味着您的Lookup
表未正确规范化。 理想情况下,最好只维护一个代码查找列。
编辑:
我建议将您的查找表重构为以下内容:
+------------+-----------+
|code |name |
+------------+-----------+
|112111213 |Name 1 |
|XXXX111111Z |Name 1 |
|000000000 |Name 2 |
|ABCD112233X |Name 2 |
+------------+-----------+
现在您可以简单地对上述code
列执行一次连接并检索name
,假设找到匹配项。 我假设不会发生多个匹配。 如果可以,那么您将需要添加逻辑来处理它。
可以是这样的代码
SELECT t1.name, t2.code1 as code FROM data as t1
INNER JOIN Lookup as t2
ON t1.code = t2.code1
UNION ALL
SELECT t1.name, t2.code2 as code FROM data as t1
INNER JOIN Lookup as t2
ON t1.code = t2.code2
您可以使用or
based join
或者您可以使用两个单独的查询与union all
。
查询一: or based join
SELECT d.code, l.name
FROM data_table d
JOIN lookup_table l ON d.code = l.code1 OR d.code = l.code2;
查询2: union all based join
SELECT d.code, l.name
FROM data_table d
JOIN lookup_table l ON d.code = l.code1
UNION ALL
SELECT d.code, l.name
FROM data_table d
JOIN lookup_table l ON d.code = l.code2;
注意:更好地使用索引使用union
查询。
PS:基于@Tim,您需要对表格进行规范化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.