我有两张桌子。桌子上有以下字段:
Field_Name Field_Type
===============================
Bill_Sts_Sk decimal(18) PK
epn_id bigint child key
epn_seq_id bigint child key
ref_id integer child key
表CLM_Crg包含以下字段:
Field_Name Field_Type
===============================
Bill_Sts_Sk decimal(18)
epn_id bigint PK
epn_seq_id bigint PK
ref_id integer PK
我需要针对BILL表针对父键(Bill_Sts_Sk)查找 Bill_Sts_Sk 。以下是查找的条件:
在epn_id上查找BILL匹配,
epn_seq_id和ref_id如果没有找到, 再次尝试使用前两个字段。
如果未找到,请使用默认值-1。
如果找到超过1个键,请使用最大值
我们如何通过编写SQL查询来实现它?我已经为第一部分编写了以下查询:
select Bill_Sts_Sk
from Bill bl
left join CLM_CRG crg
ON bl.epn_id = crg.epn_id
and bl.epn_seq_id = crg.epn_seq_id
and bl.ref_id = crg.ref_id
可以帮助我在Teradata(14.10.06.05)中为上述条件编写SQL查询
答案 0 :(得分:2)
您可以加入前两列,然后使用ROW_NUMBER寻找最佳匹配:
SELECT bl.*, COALESCE(crg.Bill_Sts_Sk, -1)
FROM Bill bl
LEFT JOIN CLM_CRG crg
ON bl.epn_id = crg.epn_id
AND bl.epn_seq_id = crg.epn_seq_id
QUALIFY
ROW_NUMBER()
OVER (PARTITION BY bl.epn_id, bl.epn_seq_id
ORDER BY CASE WHEN bl.ref_id = crg.ref_id THEN 1 ELSE 2 END -- best: matching ref_ids
,crg.Bill_Sts_Sk DESC) = 1 -- 2nd best: highest Bill_Sts_St
对于这两个表,最佳PI将在(epn_id,epn_seq_id)上。