Изглежда, че проблемът е, че не използвате (+) за вашия language_id проверки.
Таблицата ви е външно свързана, така че language_id е NULL когато не е намерен запис, но след това проверявате за language_id = 2 , но ? language_id е NULL .
Също така не виждам къде използвате резултати от a_tl или b_tl , предполагам, че това е проблем само на публикацията ви, а не на първоначалното ви запитване?
Въпреки това, моля, използвайте изрични съединения вместо стария синтаксис. След като свикнете с него, е много по-лесно за четене и разбиране.
Вашата заявка също може да се възползва от използването на COALESCE
(или NVL ако желаете):
SELECT COALESCE( a_tl.a_disp_name, a.a_name ) AS a_name,
COALESCE( b_tl.b_disp_name, b.b_name ) AS b_name,
a.a_id,
b.b_id
FROM a
JOIN b ON ( b.b_id = a.a_id )
LEFT JOIN a_tl ON ( a_tl.a_id = a.a_id AND a_tl.language_id = 2 )
LEFT JOIN b_tl ON ( b_tl.b_id = b.b_id AND b_tl.language_id = 2 )
Надявам се, че разбрах правилно въпроса ви, моля, попитайте, ако не работи.