2015-03-25 7 views
0

У меня есть запрос, который возвращает все данные из внутреннего запроса, включая еще одно поле, т. Е. Ctry из таблицы tbl_account. Я использовал LEFT JOIN, так что хотя a_row_id не сопоставляется с row_id от tbl_account, так что я все равно получаю все согласованные данные из внутреннего запроса.Случай, основанный на соединении в запросе оракула

 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 не равно нулю, то внутреннее соединение с одним дополнительным условием будет использоваться и при 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 ; 

Есть ли другой способ, что я могу реализовать случай на основе присоединяется условие в приведенном выше запросе оракулу и в то же время стоимость запроса будет less.Is можно использовать расшифровывает в этом случае? Любая помощь по этому вопросу будет принята с благодарностью.

+0

Um, 'КОГДА b.a_row_id IS NULL AND b.a_row_id = sac.row_id' ... это не будет вернуть что-либо; вы говорите, что если b.a_row_id имеет значение NULL, см., если sac.row_id = null. Не говоря уже о том, что ' = null' будет возвращать null в Oracle, на самом деле не имеет смысла это делать. Я чувствую, что вы можете сделать это с помощью одного соединения, используя 'или' 's в условии соединения. Предполагая, что у вас есть правильные условия соединения, ofc! * {;-) Это помогло бы, если бы вы могли обновить свой пример с помощью некоторых выборочных данных вместе с ожидаемым результатом, чтобы мы могли сами проверить запрос. – Boneist

ответ

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

Смежные вопросы