问题描述
我想将T1
列上的T2
与a,b,c
的联接表保留下来。
我首先尝试加入所有三列,但它们没有加入,因此作为后备我加入了a,b
列。
我该如何实现?
示例
T1:
+---+---+---+-------+
| a | b | c | mycol |
+---+---+---+-------+
| 1 | 2 | 3 | john |
| 1 | 3 | 4 | cena |
+---+---+---+-------+
T2:
+---+---+---+-------+
| a | b | c | value |
+---+---+---+-------+
| 1 | 2 | 3 | 10 |
| 1 | 3 | | 20 |
+---+---+---+-------+
加入后:
+---+---+---+-------+-------+
| a | b | c | mycol | value |
+---+---+---+-------+-------+
| 1 | 2 | 3 | john | 10 |
| 1 | 3 | 4 | cena | 20 |
+---+---+---+-------+-------+
解决方法
想必,您需要两个左联接和条件逻辑
select t1.*,coalesce(t20.a,t21.a) a2,coalesce(t20.b,t21.b) b2,coalesce(t20.c,t21.c) c2
from t1
left join t2 t20
on t20.a = t1.a and t20.b = t1.b and t20.c = t1.c
left join t2 t21
on t20.a is null and t21.b = t1.b and t21.c = t1.c
第一个左联接尝试在三列上进行匹配。第二个仅在前两个列上联接,并且仅当第一个联接返回为空时才联接。然后,您可以在coalesce()
子句中使用select
来带来相关的值。
SELECT t1.a,t1.b,t1.c,t1.mycol,t2.value
FROM t1
INNER JOIN t2 ON t1.a=t2.a AND t1.b=t2.b;
另一种简单地基于t1联接所有记录的选项:
SELECT t1.a,t2.value
FROM t1
LEFT JOIN t2 ON t1.pk=t2.pk;
,
select t1.*,coalesce(
(select t20.value from t20 where t20.a = t1.a and t20.b = t1.b and t20.c = t1.c),(select t21.value from t21 where t21.a = t1.a and t21.b = t1.b )) as "value"
from t1
对于第二个内部选择,必须确保它获得唯一的结果。因此,您可能必须将结果限制为1,但是如何实现取决于您未提及的选择数据库。