基于案例的联接在oracle查询中

时间:2015-03-25 16:05:52

标签: oracle join

我有下面的查询,它返回内部查询的所有数据,包括另一个字段,即来自tbl_account表的ctry。我使用过 LEFT JOIN,即使a_row_id与tbl_account中的row_id不匹配,这样我仍然可以从内部查询中获取所有匹配的数据。

     select b.* ,sac.ctry as country from
    (SELECT DISTINCT rec.* ,asset.a_row_id
               FROM tbl_record rec LEFT JOIN tbl_asset asset
                    ON asset.from_sn = rec.to_sn
                  AND asset.from_name = rec.to_productname
                  AND asset.from_rel = rec.to_rel
                    LEFT JOIN tbl_country mas
                    ON rec.loc = mas.a_loc                                                                       
              WHERE rec.cust_id = 2456 ) b     
              LEFT JOIN tbl_account sac on b.a_row_id = sac.row_id ;

但是,现在我需要在上面的查询中实现基于案例的连接,即当a_row_id不为null时,将使用具有一个额外条件的内连接,并且当a_row_id为空时,将使用左连接。 我已经尝试过如下使用CASE语句,但它不起作用,查询的成本也非常高,我想这是因为CASE语句。 所有表中的数据都是数百万。

 select b.* ,sac.ctry as country from
 (SELECT DISTINCT rec.* ,asset.a_row_id
               FROM tbl_record rec LEFT JOIN tbl_asset asset
                    ON asset.from_sn = rec.to_sn
                  AND asset.from_name = rec.to_productname
                  AND asset.from_rel = rec.to_rel
                    LEFT JOIN tbl_country mas
                    ON rec.loc = mas.a_loc                                                                       
              WHERE rec.cust_id = 2456 ) b     
              INNER JOIN tbl_account sac   
              ON CASE 
                 WHEN b.a_row_id IS NOT NULL AND b.a_row_id = sac.row_id and b.from_cn = SAC.to_cn THEN 1
                 END = 1
              LEFT JOIN tbl_account sac
              ON CASE 
                 WHEN b.a_row_id IS NULL AND b.a_row_id = sac.row_id THEN 1
                 END = 1 ;

有没有其他方法可以在上面的oracle查询中实现基于案例的连接条件,同时查询成本会更低。在这种情况下是否可以使用解码?任何有关这方面的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

这种语法可能就是你要找的东西:

select b.*, sac.ctry as country
  from b  
  left join tbl_account sac 
    on b.a_row_id = sac.row_id or (b.a_row_id is null and sac.row_id is null)
  where b.from_cn = sac.to_cn or b.a_row_id is null

SQLFiddle