Tu problema esta en este caso:
Código SQL:
Ver originals1.FECHDATOS = (SELECT MAX (FECHDATOS) FROM SERVICIO1)
Esa primera condición del WHERE es mandatoria, y no considera su contraparte de SERVICIO2. En ese contexto, si no se existe un registro en SERVICIO1, no saldrá en el resultado.
Si la relacion con ambos servicios es
opcional, entonces te está faltando su contrapoartida:
Código SQL:
Ver originals2.FECHDATOS = (SELECT MAX (FECHDATOS) FROM SERVICIO2)
Por lo demás, tampoco tiene ninguna utilidad poner en la ultima condición cada OR dentro de un paréntesis. Con uno que englobe a todos ellos, es suficiente.
Código SQL:
Ver original/* Formatted on 2014/07/10 10:24 (Formatter Plus v4.8.7) */
SELECT p.NOMBPROV,
s1.FECHDATOS,
s1.CODEMPR || "-" || e.NOMBEMPR,
s1.NOMBSERV,
s1.DATO1,
s1.DATO2,
s2.NOMBSERV,
s2.DATO1,
s2.DATO2
FROM PROVINCIAS p, SERVICIO1 s1, SERVICIO2 s2, EMPRESAS e
WHERE ( s1.FECHDATOS = (SELECT MAX (FECHDATOS)
FROM SERVICIO1)
OR s2.FECHDATOS = (SELECT MAX (FECHDATOS)
FROM SERVICIO2))
AND s1.CODPROV = p.CODPROV(+)
AND s1.CODEMPR = e.CODEMPR
AND s1.CODPROV = s2.CODPROV(+)
AND s1.CODEMPR = s2.CODEMPR(+)
AND s1.FECHADATOS = s2.FECHADATOS(+)
AND ( s1.DATO1 <> 0
OR s2.DATO1 <> 0
OR s1.DATO2 <> 0
OR s2.DATO2 <> 0);
Posdata: No postees un mensaje sólo para subir el post en la lista. Está prohibido expresamente por las Políticas de Uso de FDW. te recomiendo tenerlas en cuenta para evitar inconvenientes con la moderacion de los foros.