0

我有两张表, 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,LEFT JOIN它们在 a、b、c 和 d 上。

  • 否则,如果有几行具有相同的 a 和 b,并且它们不在上面提到LEFT JOIN的 a、b 和 c的集合中

  • 否则LEFT JOIN来自 tbl2 的剩余行在 a 和 b 上。

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

你有什么想法实现这一目标的最有效方法是什么?

编辑:

通过“具有相同的 a、b 和 c”,我的意思是这样的:

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

2 回答 2

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);
于 2013-07-02T08:18:29.593 回答
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) );
于 2013-07-02T08:21:19.333 回答