Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/08/2013, 08:05
1antares1
 
Fecha de Ingreso: marzo-2006
Mensajes: 43
Antigüedad: 18 años, 2 meses
Puntos: 0
Pregunta Alternativa para EXCEPT o WITH [SQL-SERVER 2008]

Buenos días, amigos foreros nuevamente del Forosdelweb;

Aquí nuevamente, intentando molestar en unas de mis "pequeñas" dudas en las que todos conocen que si las hago publicar para recibir otra visión de otros ojos o posibles soluciones, es por que probablemente haya leído X documentanción antes en Red y en el Foro.

Pero vaya.... Vayamos al grano para no fatigar más el tema.

El propósito que intento consignar, es conseguir alguna variante o alternativa para la función EXCEPT del SQL Server. La misma funciona perfectamente, pero para coger los resultados, me es un poco dificultoso, y usar WITH CTE, me afecta bastante el rendimiento. Me parece muy lento para trabajar siempre con unas 200 mil filas. Lo realicé, pero buscaría algo más óptimo o el lado correcto.

Sé que existen los mecanismos NOT IN, NOT EXISTS, LEFT OUTER JOIN, pero veamos, al parecer (o bajo mi criterio) que este no es el caso. Por que poseo 4 claves primarias, y por 1, pueden existir más líneas de diferencias. Así que mi comparación tiende a ser por 4 ID's y no por 1.

Ejemplo:

Código SQL:
Ver original
  1. ID_HOTEL     ID_SERIE     NRO_RESERVA               ID_PERIODO               ID_LINEA
  2.       1                   YAAA               220000                            1                                   1
  3.       1                   YAAA               220000                            1                                   2
  4.       1                   YAAA               220000                            1                                   3
  5.       2                   ZAAA               150000                            1                                   1
  6.       2                   ZAAA               150000                            1                                   2

Ahora, como poseo 2 tablas idénticas en otra DB, que sería como la central, necesito manipular información de ambas, y tienen que estar siempre actualizadas (sincronizadas).

Para ello, mediante un TRIGGER quisiera mostrar las diferencias o faltantes, y luego enviarlas, actualizarlas o borrar e insertar.

El caso está que en la otra tabla, si poseo esto:

Código SQL:
Ver original
  1. ID_HOTEL     ID_SERIE     NRO_RESERVA               ID_PERIODO               ID_LINEA
  2.       1                   YAAA               220000                            1                                   1
  3.       1                   YAAA               220000                            1                                   2
  4.       2                   ZAAA               150000                            1                                   1
  5.       2                   ZAAA               150000                            1                                   2

Al realizar un EXCEPT desde la A, me devolverá el siguiente registro:

Código SQL:
Ver original
  1. 1                   YAAA               220000                            1                                   3

Y funciona perfecto. Veamos, pero esta es una diferencia de cantidad de líneas. Pero ¿Qué pasa si otro campo NO PRIMARY ha sido modificado?

El EXCEPT además me compara las diferencias de líneas, y filas que se encuentren con campos disparejos, y es excelente por que también es lo que busco.

Pero ¿Como cojo la consulta del EXCEPT, para luego insertar o manipular lo que arroje? Mediante un WITH, y ahí me baso comparando las SERIES, pero me retorna bastante lento.

O la alternativa es para el EXCEPT, o para el WITH. Sea por que uno sea lento en arrojar resultados y mantenerlos (forma temporal), o el otro sea dificultoso coger su respuesta.

Probé con NOT IN, o NOT EXISTS, y me arroja solo LAS QUE NO EXISTAN. Pero es que si existen, pero de diferencia en algún campo, o líneas demás.

Sin más que agregar;

Si alguno posee alguna posible resolución del concepto. Estaría agradecido nuevamente.

Saludos para todos.
__________________
:si: ANTARES:si: