在精确字符串或截断字符串上连接表

时间:2017-02-11 12:06:58

标签: sql

好的,所以这可能是一个加载的问题。我想在两个条件下在ID上加入两个表:

  1. 完全匹配
  2. 前3个字符匹配后的字符
  3. 另外,有更好的方法来显示表吗?

    表1:

    Comp ID   Year      
    94372     2016      
    P1983     2011      
    874324    2015      
    0342135   2013      
    732423    2015      
    

    表2:

    ID          User        
    30094372    TYVSW       
    2000342135  PFDBE       
    100732423   PLECD       
    P1983       ASNWQ       
    

    加入表

    T1CompID    T1Year  T2ID    T2User          
    94372   2016    30094371    TYVSW           
    P1983   2011    P1983   ASNWQ           
    874324  2015    Null    Null            
    0342135 2013    2000342135  PFDBE           
    732423  2015    100732423   PLECD           
    

3 个答案:

答案 0 :(得分:0)

在第一个表中的ID条件与第二个表中的ID完全匹配时执行LEFT JOIN,或者第一个表中的ID与第二个表的第四个字符中的子串匹配。 / p>

SELECT t1."Comp ID" AS T1CompID,
       t1.Year AS T1Year,
       t2.ID AS T2ID,
       t2.User AS T2User  
FROM table1 t1
LEFT JOIN table2 t2
    ON t1."Comp ID" = t2.ID OR             -- exact match
       t1."Comp ID" = SUBSTRING(t2.ID, 4)  -- match from fourth character of t2.ID

对于SQL Server,您可能需要使用[Comp ID]来转义此列名。

答案 1 :(得分:0)

试试这个

      SELECT * FROM tb1 t1 
      LEFT JOIN tb2 t2 
      ON IF(length(t1.ID) = length(t2.ID),t1.ID = t2.ID,substring(t2.ID,4) = t1.ID);

      +---------+------+------------+-------+
      | ID      | Year | ID         | User  |
      +---------+------+------------+-------+
      | 94372   | 2016 | 30094372   | TYVSW |
      | 0342135 | 2013 | 2000342135 | PFDBE |
      | 732423  | 2015 | 100732423  | PLECD |
      | P1983   | 2011 | P1983      | ASNWQ |
      | 874324  | 2015 | NULL       | NULL  |
      +---------+------+------------+-------+
     5 rows in set (0.00 sec)

答案 2 :(得分:0)

为了提高性能,您可能需要使用两个左连接:

select t1.compid, t1.year, 
       coalesce(t2e.id, t2p.id) as t2id
       coalesce(t2e.user, t2p.user) as t2.user
from table1 t1 left join
     table2 t2e
     on t1.compid = t2.compid left join
     table2 t2p
     on t1.compid = substring(t2p.id, 4, 100) and
        t2e.compid is null;

从第4个字符开始获取值的确切表达式在数据库与数据库之间略有不同。

这种方法的一个优点是,即使第二个表中有两行匹配,它也只会返回完全匹配。