繁体   English   中英

如何从第二个连接表中获取 select 行,可以根据源列值的长度在 2 列中的任何一个上连接

[英]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     |
|           |            |
+-----------+------------+

假设只有code1code2在连接中匹配,您可以尝试使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM