当列可用时的SQL连接否则与其余列连接?

问题描述

我想将T1列上的T2a,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,但是如何实现取决于您未提及的选择数据库。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...