Creo que la solución de VivaerBetis es más elegante.

Es decir, las tablas B y C son complementarias ya que no tendrán registros repetidos con el mismo código por lo que dices, en ese caso lo mejor es crearse una tabla intermedia con la union de las dos.

Este es el paso uno.

Ahora lo "bonito" del sql (por cierto, de que BBDD hablamos?? no es lo mismo un oracle que un sql server) es que se puede aplicar la join a una tabla temporal.

Uso sintaxis Sql server (que es en lo que llevo años currando) para que se vea la idea, porque de oracle me acuerdo poco...


Select A.Codigo, A.Nombre, BC.Direccion
FROM tabla_a AS A
LEFT JOIN (select B.Codigo, B.Calle as Direccion
FROM tabla_b as B

UNION ALL

select C.Codigo, C.Carretera as Direccion
FROM tabla_c as C) AS BC
ON A.Codigo = BC.Codigo

Esto funciona perfectamente y además al optimizador del sql le mola mucho...

Si la "Dirección" no es solo la calle, puedes montarla concatenando campos siempre y cuando las dos selects de la union devuelvan siempre el mismo número de campos.