2013-07-02 35 views
0

我有兩個表,我必須加入tbl和tbl2。 tbl的列是無關緊要的。這裏是TBL2的tructure:基於條件在不同列上加入2個表

CREATE TABLE tbl2 (
a VARCHAR(10) 
, b VARCHAR(10) 
, c VARCHAR(10) 
, d VARCHAR(10) 
, e VARCHAR(10) 
); 

我需要做的是應用以下連接:

  • 如果有多個行具有相同的a,b和c LEFT JOIN他們上, b,c和d。

  • 否則如果有若干行用相同的a和b以及它們不在上的a,b上面提到LEFT JOIN該組和c

  • 否則從TBL2上a和b LEFT JOIN剩餘的行。

我一直在想什麼是實現以下目標的最佳途徑。 tbl2可以修改,因爲它僅用於此查詢的目的。

你有什麼想法什麼是實現這個最有效的方式?

編輯:

通過 '具有相同的a,b和c' 我的意思是這樣的:

SELECT a, b, c FROM tbl2 GROUP BY a, b ,c HAVING COUNT(*) > 1 

回答

0

把這三個查詢中的if else條件。如果你想要他們全部,那麼聯合這三個。

select * 
from tbl t1 left outer join tbl2 t2 
on (t1.a=t2.a and t1.b=t2.b and t1.c=t2.c and t1.d=t2.d) 
where t2.a=t2.b and t2.b=t2.c; 

select * 
from tbl t1 left outer join tbl2 t2 
on (t1.a=t2.a and t1.b=t2.b and t1.c=t2.c) 
where t2.a=t2.b and t2.b<>t2.c; 

select * 
from tbl t1 left outer join tbl2 t2 
on (t1.a=t2.a and t1.b=t2.b) 
where t2.a<>t2.b and t2.b<>t2.c; 

或試試這個:

select * 
from tbl t1 left outer join tbl2 t2 
on (
(t1.a=t2.a and t1.b=t2.b and t1.c=t2.c and t1.d=t2.d and t2.a=t2.b and t2.b=t2.c) 
    or 
(t1.a=t2.a and t1.b=t2.b and t1.c=t2.c and t2.a=t2.b and t2.b<>t2.c) 
    or 
(t1.a=t2.a and t1.b=t2.b and t2.a<>t2.b and t2.b<>t2.c)); 
+0

這是來到了我的腦海裏的第一件事情,但我想知道是否有這樣做,而不必工會這一切的方式。 – kyooryu

1
WITH tab_a AS 
(
     SELECT t2.a 
     ,  t2.b 
     ,  t2.c 
     ,  t2.d 
     ,  t2.e 
     ,  CASE WHEN t1.c = t2.c THEN 1 ELSE 0 END + 
       CASE WHEN t1.d = t2.d THEN 1 ELSE 0 END AS other_two 
     FROM tbl t1 
     LEFT JOIN tbl2 t2 
     ON  t1.a = t2.a 
     AND  t1.b = t2.b 
) 
SELECT a 
,  b 
,  c 
,  d 
,  e 
FROM tab_a 
WHERE other_two = (SELECT MAX(other_two) FROM tab_a);