如何基于多种条件在teradata中编写sql查询

如何基于多种条件在teradata中编写sql查询,sql,teradata,Sql,Teradata,我有两个表。表比尔有以下字段: 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 Field_Name Field_Type ======

我有两个表。表比尔有以下字段:

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
Field_Name    Field_Type
===============================
Bill_Sts_Sk   decimal(18)   
epn_id        bigint       PK
epn_seq_id    bigint       PK
ref_id        integer      PK
表CLM_Crg包含以下字段:

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
Field_Name    Field_Type
===============================
Bill_Sts_Sk   decimal(18)   
epn_id        bigint       PK
epn_seq_id    bigint       PK
ref_id        integer      PK
我需要根据Bill表的父项(Bill_stu Sk)查找Bill_stu Sk。以下是查找的条件:

查询epn_id上的账单匹配,
epn顺序id和参考id

如果没有找到, 请仅使用前两个字段重试

如果未找到,请使用默认值-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查询

您可以在前两列上加入,然后使用行号查找最佳匹配:

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为on(epn_id,epn_seq_id)。

您可以在前两列上联接,然后使用行号查找最佳匹配:

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为on(epn_id,epn_seq_id)