Wygląda na to, że problem polega na tym, że nie używasz (+) dla Twojego language_id sprawdza.
Twoja tabela jest połączona na zewnątrz, więc language_id jest NULL gdy nie znaleziono żadnego rekordu, ale sprawdzasz, czy language_id = 2 , ale ? language_id jest NULL .
Nie widzę też, gdzie używasz wyników z a_tl lub b_tl , domyślasz się, że to tylko problem z Twoim postem, a nie z pierwotnym zapytaniem?
Należy jednak używać jawnych złączeń zamiast starej składni. Gdy już się do tego przyzwyczaisz, będzie to o wiele łatwiejsze do odczytania i zrozumienia.
Twoje zapytanie może również skorzystać z użycia COALESCE
(lub NVL jeśli chcesz):
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 )
Mam nadzieję, że dobrze odpowiedziałem na Twoje pytanie, zapytaj, czy to nie działa.