Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Un SELECT complejo con JOINs

Estas en el tema de Un SELECT complejo con JOINs en el foro de Oracle en Foros del Web. Buenos días amigos, os escribo porque tengo problemas con una consulta SQL de ORACLE. Esta consulta es heredada (es decir, no la hice yo), y ...
  #1 (permalink)  
Antiguo 07/07/2014, 06:35
Isdiar
Invitado
 
Mensajes: n/a
Puntos:
Exclamación Un SELECT complejo con JOINs

Buenos días amigos,

os escribo porque tengo problemas con una consulta SQL de ORACLE. Esta consulta es heredada (es decir, no la hice yo), y hemos detectado que tenemos un problemilla.

La consulta SQL que pongo de ejemplo es:

Código SQL:
Ver original
  1. SELECT p.NOMBPROV,
  2.        s1.FECHDATOS,
  3.        s1.CODEMPR || "-" || e.NOMBEMPR
  4.        s1.NOMBSERV,
  5.        s1.DATO1,
  6.        s1.DATO2,
  7.        s2.NOMBSERV,
  8.        s2.DATO1,
  9.        s2.DATO2
  10.  
  11. FROM PROVINCIAS p,
  12.      SERVICIO1 s1,
  13.      SERVICIO2 s2,
  14.      EMPRESAS e
  15.  
  16. WHERE s1.FECHDATOS = (SELECT MAX (FECHDATOS ) FROM SERVICIO1) AND
  17.       s1.CODPROV = p.CODPROV(+) AND
  18.       s1.CODEMPR = e.CODEMPR AND
  19.       s1.CODPROV = s2.CODPROV(+) AND
  20.       s1.CODEMPR = s2.CODEMPR(+) AND
  21.       s1.FECHADATOS = s2.FECHADATOS(+) AND
  22.     ((s1.DATO1 <> 0 OR
  23.       s2.DATO1 <> 0) OR
  24.      (s1.DATO2 <> 0 OR
  25.       s2.DATO2 <> 0))
  26. ;

La intención es unificar los datos de ambos servicios (SERVICIO1 y SERVICIO2). Sin embargo, tal y como está actualmente montada la sentencia, me mostrará los datos de ambos servicios siempre y cuando la EMPRESA trabaje para dar soporte, al menos, en SERVICIO1.

Es decir, si la empresa con CODEMPR "EMPR01" da soporte a SERVICIO1 y SERVICIO2, la obtendremos en el SELECT. Si la empresa con CODEMPR "EMPR02" da soporte a SERVICIO1 sólamente, también la obtendremos en el SELECT. Sin embargo, si la empresa con CODEMPR "EMPR03" da soporte únicamente a SERVICIO2, no obtendremos dichos datos en el SELECT.

Creo que la cuestión está en que estamos tomando en el lado izquierdo de las comparaciones del WHERE con SERVICIO1. He intentado probar algunas modificaciones de la sentencia SQL, pero no logro solucionar esta errata. ¿Podríais orientarme y ayudarme?

Muchas gracias de antemano. Un saludo.

Última edición por gnzsoloyo; 10/07/2014 a las 06:49
  #2 (permalink)  
Antiguo 10/07/2014, 07:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Un SELECT complejo con JOINs

Tu problema esta en este caso:
Código SQL:
Ver original
  1. s1.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 original
  1. s2.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
  1. /* Formatted on 2014/07/10 10:24 (Formatter Plus v4.8.7) */
  2. SELECT p.NOMBPROV,
  3.        s1.FECHDATOS,
  4.        s1.CODEMPR || "-" || e.NOMBEMPR,
  5.        s1.NOMBSERV,
  6.        s1.DATO1,
  7.        s1.DATO2,
  8.        s2.NOMBSERV,
  9.        s2.DATO1,
  10.        s2.DATO2
  11.   FROM PROVINCIAS p, SERVICIO1 s1, SERVICIO2 s2, EMPRESAS e
  12.  WHERE (   s1.FECHDATOS = (SELECT MAX (FECHDATOS)
  13.                              FROM SERVICIO1)
  14.         OR s2.FECHDATOS = (SELECT MAX (FECHDATOS)
  15.                              FROM SERVICIO2))
  16.    AND s1.CODPROV = p.CODPROV(+)
  17.    AND s1.CODEMPR = e.CODEMPR
  18.    AND s1.CODPROV = s2.CODPROV(+)
  19.    AND s1.CODEMPR = s2.CODEMPR(+)
  20.    AND s1.FECHADATOS = s2.FECHADATOS(+)
  21.    AND (   s1.DATO1 <> 0
  22.         OR s2.DATO1 <> 0
  23.         OR s1.DATO2 <> 0
  24.         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.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: join, joins, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:12.