2017-02-11 18 views
0

好的,所以這可能是一個加載的問題。我想加入上的ID兩個表兩個條件:在精確字符串或截斷字符串上連接表格

  1. 精確匹配
  2. 人物第一後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   
+1

你沒有提到你正在使用哪個數據庫服務器。您可以在JOIN中使用SUBSTRING或類似的功能。或者更好地創建一個多列(可能是一個計算列)來保存字符是前3,並在您的JOIN中使用OR。 – endo64

+0

你正在使用哪些DBMS? –

+0

我正在使用Oracle。 – Sydonius

回答

0

上的ID的條件執行LEFT JOIN從第一表要麼完全匹配來自第二個表的ID,或來自第一個表的ID匹配f的子字符串第二張桌子的第四個字符。

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]來轉義此列名稱。

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) 
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個字符所獲得的價值的精確表達式起變化了一下,從數據庫數據庫。

這種方法的一個優點是,即使在第二個表中有兩個匹配的行,它也只會返回完全匹配。