У меня есть запрос, который возвращает все данные из внутреннего запроса, включая еще одно поле, т. Е. 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 можно использовать расшифровывает в этом случае? Любая помощь по этому вопросу будет принята с благодарностью.
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