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

[SOLUCIONADO] Alternativa para EXCEPT o WITH [SQL-SERVER 2008]

Estas en el tema de Alternativa para EXCEPT o WITH [SQL-SERVER 2008] en el foro de SQL Server en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 28/08/2013, 08:05
 
Fecha de Ingreso: marzo-2006
Mensajes: 43
Antigüedad: 18 años, 1 mes
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:
  #2 (permalink)  
Antiguo 28/08/2013, 08:42
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Alternativa para EXCEPT o WITH [SQL-SERVER 2008]

a lo que entiendo necesitas hacer actualizaciones de los datos en 2 bases de datos diferentes correcto? porque no usas algun metodo de replicacion (mirroring, snapshot) creo que seria mas conveniente no?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 28/08/2013, 09:50
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Alternativa para EXCEPT o WITH [SQL-SERVER 2008]

Bueno Libras, a veces habremos muchos que queremos inventar el agua embotellada o el hilo negro.....
__________________
MCTS Isaias Islas
  #4 (permalink)  
Antiguo 28/08/2013, 09:55
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Alternativa para EXCEPT o WITH [SQL-SERVER 2008]

Cita:
Iniciado por iislas Ver Mensaje
Bueno Libras, a veces habremos muchos que queremos inventar el agua embotellada o el hilo negro.....
A bueno eso que ni que, pero si ya esta inventado el hilo negro, para que reinventarlo? jejejeje
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 28/08/2013, 11:05
 
Fecha de Ingreso: marzo-2006
Mensajes: 43
Antigüedad: 18 años, 1 mes
Puntos: 0
Busqueda Respuesta: Alternativa para EXCEPT o WITH [SQL-SERVER 2008]

Buenas tardes, amigo Libras;

Te comento, cuando me referí a lo del: "Sincronizada" o ambos datos actualizados (al parecer, no detallé de mi estructura, solo lo que no encuentro), es por que manejo 2 DB's, donde en 1 manejo varias sucursales, y una de las sucursales, se maneja en 1 DB aparte. Conozco el Mirroring del SQL Server, pero NO quiero mantener un reflejado, únicamente son tablas específicas. Pero que no todas las tablas son las misma, o deseo mantener congruencia.

Colocando como suposición que son 2 tablas idénticas, y 1 la quiero para un propósito con campos externos, y no tocar la principal que ya posee 200~ mil registros, ni crearle campos o algo referente. Pienso mantener 1 de ellas con lo mismo, pero con unas restricciones y manipulaciones adicionales.

Sin más que agregar; Espero haberme explicado mejor.

Un cordial saludo.
__________________
:si: ANTARES:si:
  #6 (permalink)  
Antiguo 28/08/2013, 11:26
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Alternativa para EXCEPT o WITH [SQL-SERVER 2008]

siento que podrias sacarlo con un logshipping, pero ps si quieres hacerlo con triggers tambien es valido :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 28/08/2013, 13:08
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Alternativa para EXCEPT o WITH [SQL-SERVER 2008]

Tu puedes imitar el Except con un Left Join o Where Not Exists o aun Where .. No In,
pero el rendimiento sera lo mismo.
En estos casos el sistema puede aprovechar los Indexes (espero que el Primary Key es tambien el Clustered Index) solo parcialmente porque debe comparar todas las columnas.

El With no tiene nada que ver con el rendimiento. Puedes escribir el Except simplemente:
Código SQL:
Ver original
  1. SELECT * FROM T1
  2. EXCEPT
  3. SELECT * FROM T2;
o con With:
Código SQL:
Ver original
  1. WITH CTE AS
  2. (SELECT * FROM T1
  3. EXCEPT
  4. SELECT * FROM T2)
  5. SELECT * FROM CTE;
o dentro de una subconsulta:
Código SQL:
Ver original
  1. SELECT *
  2. FROM (SELECT * FROM T1
  3.      EXCEPT
  4.      SELECT * FROM T2) AS T
  5. SELECT * FROM T;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #8 (permalink)  
Antiguo 03/09/2013, 07:33
 
Fecha de Ingreso: marzo-2006
Mensajes: 43
Antigüedad: 18 años, 1 mes
Puntos: 0
De acuerdo Respuesta: Alternativa para EXCEPT o WITH [SQL-SERVER 2008]

Buenos días;

Ok!

GeriReshef, es lo que más o menos estaba buscando o requería en mi sugerencia.

Y si, también es una opción, que a la final conseguí una forma semejante, además un poco más óptima que mantenerlo con el WITH.

Ej.:

Código SQL:
Ver original
  1. CREATE #TABLE
  2.  
  3. SELECT *
  4. FROM T
  5. INTO #Table
  6.  
  7. EXCEPT
  8.  
  9. SELECT *
  10. FROM T2.
Y puedo manipular el #Table, hasta que la destruya o acabe la consulta. Como también Tabla tipo variable.

Pero probaré tu alternativa para comparar el rendimiento.

Agradecido por tu respuesta.

Cordial saludo. Sin más;

Solucionado.
__________________
:si: ANTARES:si:

Etiquetas: insert, registro, server, sql, tabla
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 04:17.