SQL 条件加入 Teradata
SQL conditional join Teradata
我正在尝试在 T1.id=T2.id、T1.MonA=T2.MonB 上加入以下两个 tables T1 和 T2,这样
- 每当 MonA=MonB(现在可以在两个 table 中找到一个条目),
执行普通连接。 ID A的实例就是这种情况,
MonA=MonB=3
- 如果 MonB 条目在 table T2 中,但在中找不到相同的 MonA 条目
Table T1,连接应取自 table T1 MonA 所在的行
最大。在示例 table 中,最后两行都是这种情况。
- 不在 T2 中的来自 T1 的 MonA 将被忽略
条件T1.id=T2.id是一个必要的前提条件,所以这总是需要为真!
Table T1
ID MonA Data
A 2 BBB
A 3 CCC
B 4 DDD
B 5 EEE
B 11 EEE
Table T2
ID MonB Organ
A 3 Liver
B 5 Heart
B 7 Kidney
结果应该是这样的
ID MonA MonB Data Organ
A 3 3 CCC Liver
B 5 5 EEE Heart
B 11 7 EEE Kidney
我需要在 Teradata SQL 中执行此操作,老实说目前不知道如何解决该问题。感谢您的帮助!
编辑:可能有多个条目具有相同的 ID,MonA=MonB,但 Data/Organ 列不同,我希望所有条目都在结果 table.
中
让我们按如下方式连接 t1 和 t2
--gets all of the matching records by (id,mona) pairs from t1 with (id,monb) from t2
select a.id,a.mona,b.monb,a.data,b.organ
from t1 a
join t2 b
on a.id=b.id
and a.mona=b.monb
union all /*Here you want only from t2 not there in t1 by id*/
select b.id,x.mona,b.monb,x.data,b.organ
from t2 b
left join t1 a
on a.id=b.id
and a.mona=b.monb
left join (select row_number() over(partition by id order by mona desc) as rnk
,id
,mona
,data
from t1
)x
on b.id=x.id
and x.rnk=1 /*pick up only the largest values arranged by mona*/
where a.mona is null /*Gets only the missing records from t2 which are not in t1*/
这应该return预期结果:
SELECT t1.id,t1.mona,t2.monb,t1.data,t2.organ
FROM t1
JOIN t2
ON t1.id=t2.id
QUALIFY
Row_Number()
Over (PARTITION BY t2.id, t2.organ
-- prefer same entry in both tables
ORDER BY CASE WHEN t1.mona = t2.monb THEN 1 ELSE 2 END
-- otherwise take max monA
,t1.mona DESC -- ) = 1
我正在尝试在 T1.id=T2.id、T1.MonA=T2.MonB 上加入以下两个 tables T1 和 T2,这样
- 每当 MonA=MonB(现在可以在两个 table 中找到一个条目), 执行普通连接。 ID A的实例就是这种情况, MonA=MonB=3
- 如果 MonB 条目在 table T2 中,但在中找不到相同的 MonA 条目 Table T1,连接应取自 table T1 MonA 所在的行 最大。在示例 table 中,最后两行都是这种情况。
- 不在 T2 中的来自 T1 的 MonA 将被忽略
条件T1.id=T2.id是一个必要的前提条件,所以这总是需要为真!
Table T1 ID MonA Data A 2 BBB A 3 CCC B 4 DDD B 5 EEE B 11 EEE
Table T2 ID MonB Organ A 3 Liver B 5 Heart B 7 Kidney
结果应该是这样的
ID MonA MonB Data Organ A 3 3 CCC Liver B 5 5 EEE Heart B 11 7 EEE Kidney
我需要在 Teradata SQL 中执行此操作,老实说目前不知道如何解决该问题。感谢您的帮助!
编辑:可能有多个条目具有相同的 ID,MonA=MonB,但 Data/Organ 列不同,我希望所有条目都在结果 table.
中让我们按如下方式连接 t1 和 t2
--gets all of the matching records by (id,mona) pairs from t1 with (id,monb) from t2
select a.id,a.mona,b.monb,a.data,b.organ
from t1 a
join t2 b
on a.id=b.id
and a.mona=b.monb
union all /*Here you want only from t2 not there in t1 by id*/
select b.id,x.mona,b.monb,x.data,b.organ
from t2 b
left join t1 a
on a.id=b.id
and a.mona=b.monb
left join (select row_number() over(partition by id order by mona desc) as rnk
,id
,mona
,data
from t1
)x
on b.id=x.id
and x.rnk=1 /*pick up only the largest values arranged by mona*/
where a.mona is null /*Gets only the missing records from t2 which are not in t1*/
这应该return预期结果:
SELECT t1.id,t1.mona,t2.monb,t1.data,t2.organ
FROM t1
JOIN t2
ON t1.id=t2.id
QUALIFY
Row_Number()
Over (PARTITION BY t2.id, t2.organ
-- prefer same entry in both tables
ORDER BY CASE WHEN t1.mona = t2.monb THEN 1 ELSE 2 END
-- otherwise take max monA
,t1.mona DESC -- ) = 1