根据条件在不同列上连接2个表

时间:2013-07-02 08:04:13

标签: sql oracle

我有两个表,tbl和tbl2我必须加入。 tbl的列是无关紧要的。这是tbl2的结构:

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

我需要做的是应用以下联接:

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

  • 否则,如果有多个行具有相同的a和b,并且它们不在上面提到的集合中{a},则在a,b和c上

  • 在a和b上从tbl2剩余LEFT JOIN行。

我一直在想什么是实现以下目标的最佳方法。 tbl2可以修改,因为它仅用于此查询。

您有什么想法,最有效的方法是什么?

编辑:

通过'拥有相同的a,b和c',我的意思是这样的:

LEFT JOIN

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

将这三个查询放入if else条件中。如果你想要它们,那么UNION就是这三个。

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) );