我有两个表,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
答案 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) );