我有下面的查询,它返回内部查询的所有数据,包括另一个字段,即来自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查询中实现基于案例的连接条件,同时查询成本会更低。在这种情况下是否可以使用解码?任何有关这方面的帮助将不胜感激。
答案 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