2016-02-11 55 views
0

我有两个tables.Table比尔编写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 

表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_Sts_Sk针对BILL表的父母键(Bill_Sts_Sk)。以下是查询条件:

查找关于epn_id BILL匹配,
epn_seq_id和REF_ID

如果没有找到, 再试一次只使用第2场。

如果找不到使用默认值-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数据为上述条件的SQL查询(14.10.06.05)

回答

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)两个表。