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

Problemc con sentencia UNION

Estas en el tema de Problemc con sentencia UNION en el foro de SQL Server en Foros del Web. Hola a todos. Tengo un problema con una sentencia union y es muy curioso, ya que cada uno de los select por si mismo funciona. ...
  #1 (permalink)  
Antiguo 29/11/2006, 11:07
yz!
Invitado
 
Mensajes: n/a
Puntos:
Problemc con sentencia UNION

Hola a todos.
Tengo un problema con una sentencia union y es muy curioso, ya que cada uno de los select por si mismo funciona. A ver si me pueden ayudar:
Código:
SELECT Ofertas.*, Empresas.Nombre FROM Ofertas 
INNER JOIN Empresas 
ON Ofertas.ID_Empresa = Empresas.ID_EMPRESA 
WHERE (Ofertas.id_tipo=12 AND Ofertas.oferta_archivada=0) 
ORDER BY Ofertas.Fecha DESC 

UNION 

SELECT Ofertas.*, Empresas.Nombre 
FROM Ofertas 
INNER JOIN Contratacion_Destinos 
ON Ofertas.ID_DESTINO = Contratacion_Destinos.ID_DESTINO 
INNER JOIN Contratacion_Servicios 
ON Contratacion_Destinos.ID_PARAMETRO = Contratacion_Servicios.ID_PARAMETRO 
INNER JOIN Empresas 
ON Ofertas.ID_Empresa = Empresas.ID_EMPRESA 
WHERE (ofertas.tipo_oferta = 1) and  (Contratacion_Destinos.Activo = 1) 
AND (UPPER(Contratacion_Servicios.Parametro) = 'OFERTADESTACADAS' OR UPPER(Contratacion_Servicios.Parametro) = 'OFERTADESTACADAM') 
AND (Contratacion_Destinos.FechaProrroga > GETDATE()) 
ORDER BY Ofertas.Fecha DESC
He probado con union, union all... ¿Ven algo que me haya dejado?

Gracias y un saludo
  #2 (permalink)  
Antiguo 29/11/2006, 12:31
 
Fecha de Ingreso: noviembre-2006
Ubicación: México
Mensajes: 866
Antigüedad: 17 años, 5 meses
Puntos: 8
Que tal yz!.

Y cuál es el problema, podrías decir que error te marca o que pasa?

Saludos.
  #3 (permalink)  
Antiguo 30/11/2006, 02:06
yz!
Invitado
 
Mensajes: n/a
Puntos:
Cuando ejectuto la consulta en el analizador de consultas de SQL Server me dice:

Servidor: mensaje 156, nivel 15, estado 1, línea 14
Sintaxis incorrecta cerca de la palabra clave 'UNION'.
  #4 (permalink)  
Antiguo 30/11/2006, 09:48
yz!
Invitado
 
Mensajes: n/a
Puntos:
¿Algún moderador puede moverlo a SQL server?
No me di cuenta de donde publicaba el post.

PD: una mano por favor estoy desesperado.
  #5 (permalink)  
Antiguo 01/12/2006, 03:41
yz!
Invitado
 
Mensajes: n/a
Puntos:
He estado trabajando sobre la consulta, cambiando el ORDER BY al final de las dos consultas, y entonces me salta otro error:

Servidor: mensaje 8163, nivel 16, estado 4, línea 1
Los tipos de datos text, ntext e image no se pueden seleccionar con DISTINCT.

Pero en la consulta no hay ningun dato txet, ntext o image.

Puede estar el problema en en que las dos sentencias que intento unir tengan un inner join?
  #6 (permalink)  
Antiguo 01/12/2006, 08:29
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años, 1 mes
Puntos: 3
Haz esto:
EL ORDER BY ponlo solo al final, no en las dos sentencias, si la pones en ambas te saldrá ese error, supuestamente ordena todo como si fuera una sola consulta.
Saludos, espero tu comentario
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
  #7 (permalink)  
Antiguo 01/12/2006, 08:59
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
PequeñoMauro tiene razon, solo algunas observaciones:
En la consulta pones Ofertas.*, esto no es conveniente, y menos en un UNION mejor identifica los campos que vas a necesitar de la tabla Ofertas, por otro lado la segunda consulta del union:

Código:
SELECT Ofertas.*, Empresas.Nombre 
FROM Ofertas 
INNER JOIN Contratacion_Destinos 
ON Ofertas.ID_DESTINO = Contratacion_Destinos.ID_DESTINO 
INNER JOIN Contratacion_Servicios 
ON Contratacion_Destinos.ID_PARAMETRO = Contratacion_Servicios.ID_PARAMETRO 
INNER JOIN Empresas 
ON Ofertas.ID_Empresa = Empresas.ID_EMPRESA 
WHERE (ofertas.tipo_oferta = 1) and  (Contratacion_Destinos.Activo = 1) 
AND (UPPER(Contratacion_Servicios.Parametro) = 'OFERTADESTACADAS' OR UPPER(Contratacion_Servicios.Parametro) = 'OFERTADESTACADAM') 
AND (Contratacion_Destinos.FechaProrroga > GETDATE()) 
ORDER BY Ofertas.Fecha DESC
haces un Join contra la tabla Contratacion_Servicios, y no muestras info de esta, te aconsejo que evites al máximo las clausulas Joins ya que son muy pesadas para el servidor por que utilizan tablas temnporales para evaluar el conjunto de resultados, mejor utiliza un EXISTS y veras la mejora en el rendimiento de tu consulta

Saludos!
  #8 (permalink)  
Antiguo 01/12/2006, 22:49
yz!
Invitado
 
Mensajes: n/a
Puntos:
Cita:
Iniciado por Gabo77 Ver Mensaje
PequeñoMauro tiene razon, solo algunas observaciones:
En la consulta pones Ofertas.*, esto no es conveniente, y menos en un UNION mejor identifica los campos que vas a necesitar de la tabla Ofertas,
Use esto ya que es uan tabla con mas de 30 campos, la base de datos que me encontre es horrible, pero de momento no puedo reformarla.

Cita:
Iniciado por Gabo77 Ver Mensaje
haces un Join contra la tabla Contratacion_Servicios, y no muestras info de esta, te aconsejo que evites al máximo las clausulas Joins ya que son muy pesadas para el servidor por que utilizan tablas temnporales para evaluar el conjunto de resultados, mejor utiliza un EXISTS y veras la mejora en el rendimiento de tu consulta
Ok. No sabia esto, asi que he estado investigando y reforme la consulta como me dijiste, quedo así, por si el ejemplo le sirve a alguien:
Código:
SELECT Ofertas.*, Empresas.Nombre 
FROM Ofertas 
INNER JOIN Empresas 
ON Ofertas.ID_Empresa = Empresas.ID_EMPRESA 
WHERE ((ofertas.tipo_oferta = 1)
AND EXISTS(
    select *
    from Contratacion_Destinos
    where Ofertas.ID_DESTINO = Contratacion_Destinos.ID_DESTINO
    AND Contratacion_Destinos.Activo = 1
    AND (Contratacion_Destinos.FechaProrroga > GETDATE()) 
    AND EXISTS(
        select *
        from Contratacion_Servicios
        where Contratacion_Destinos.ID_PARAMETRO = Contratacion_Servicios.ID_PARAMETRO
        AND (UPPER(Contratacion_Servicios.Parametro) = 'OFERTADESTACADAS' 
        OR UPPER(Contratacion_Servicios.Parametro) = 'OFERTADESTACADAM')
    )
))
y para terminar con el union, solo tuve que agregar al final esta linea.
Código:
OR (Ofertas.id_tipo=12 AND Ofertas.oferta_archivada=0) 
ORDER BY Ofertas.Fecha DESC
Quedando todo mucho más limpio y como decias mejor rendimiento.

Muchas gracias a los dos.

PD: Aprendí mucho con esta consulta, cambiaré un montón de procedimientos almacenados en el servidor gracias a esto.
  #9 (permalink)  
Antiguo 02/12/2006, 16:33
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Excelente! otro consejo mas, en los exists no se tiene que avluar todo el contenido de la tabla, cambia el * por TOP 1 (un campo clave de la tabla) y sera mejor, Saludos!
  #10 (permalink)  
Antiguo 26/03/2008, 08:45
 
Fecha de Ingreso: marzo-2008
Mensajes: 1
Antigüedad: 16 años, 1 mes
Puntos: 0
Re: Problemc con sentencia UNION

EL ORDER BY LO TENES QUE DEJAR DE ULTIMO
PROBA ASI


(SELECT Ofertas.*, Empresas.Nombre FROM Ofertas
INNER JOIN Empresas
ON Ofertas.ID_Empresa = Empresas.ID_EMPRESA
WHERE (Ofertas.id_tipo=12 AND Ofertas.oferta_archivada=0) )
UNION
(SELECT Ofertas.*, Empresas.Nombre
FROM Ofertas
INNER JOIN Contratacion_Destinos
ON Ofertas.ID_DESTINO = Contratacion_Destinos.ID_DESTINO
INNER JOIN Contratacion_Servicios
ON Contratacion_Destinos.ID_PARAMETRO = Contratacion_Servicios.ID_PARAMETRO
INNER JOIN Empresas
ON Ofertas.ID_Empresa = Empresas.ID_EMPRESA
WHERE (ofertas.tipo_oferta = 1) and (Contratacion_Destinos.Activo = 1)
AND (UPPER(Contratacion_Servicios.Parametro) = 'OFERTADESTACADAS' OR UPPER(Contratacion_Servicios.Parametro) = 'OFERTADESTACADAM')
AND (Contratacion_Destinos.FechaProrroga > GETDATE()) )
ORDER BY Ofertas.Fecha DESC


PROBA ASI POR QUE YO TUBE EL MISMO PROBLEMA Y LO RESOLVI PONIENDO LOS PARENTESIS






Cita:
Iniciado por yz! Ver Mensaje
Hola a todos.
Tengo un problema con una sentencia union y es muy curioso, ya que cada uno de los select por si mismo funciona. A ver si me pueden ayudar:
Código:
SELECT Ofertas.*, Empresas.Nombre FROM Ofertas 
INNER JOIN Empresas 
ON Ofertas.ID_Empresa = Empresas.ID_EMPRESA 
WHERE (Ofertas.id_tipo=12 AND Ofertas.oferta_archivada=0) 
ORDER BY Ofertas.Fecha DESC 

UNION 

SELECT Ofertas.*, Empresas.Nombre 
FROM Ofertas 
INNER JOIN Contratacion_Destinos 
ON Ofertas.ID_DESTINO = Contratacion_Destinos.ID_DESTINO 
INNER JOIN Contratacion_Servicios 
ON Contratacion_Destinos.ID_PARAMETRO = Contratacion_Servicios.ID_PARAMETRO 
INNER JOIN Empresas 
ON Ofertas.ID_Empresa = Empresas.ID_EMPRESA 
WHERE (ofertas.tipo_oferta = 1) and  (Contratacion_Destinos.Activo = 1) 
AND (UPPER(Contratacion_Servicios.Parametro) = 'OFERTADESTACADAS' OR UPPER(Contratacion_Servicios.Parametro) = 'OFERTADESTACADAM') 
AND (Contratacion_Destinos.FechaProrroga > GETDATE()) 
ORDER BY Ofertas.Fecha DESC
He probado con union, union all... ¿Ven algo que me haya dejado?

Gracias y un saludo
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 07:12.