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

No listar datos repetidos en la misma tabla

Estas en el tema de No listar datos repetidos en la misma tabla en el foro de SQL Server en Foros del Web. Hola, mi problema es le siguiente. Tengo una tabla de rubros, la cual esta compuesta por TCOD RUBCOD, RUBDESC. El TCOD puede ser 'P' o ...
  #1 (permalink)  
Antiguo 12/05/2011, 09:18
 
Fecha de Ingreso: marzo-2011
Mensajes: 75
Antigüedad: 13 años, 1 mes
Puntos: 6
Pregunta No listar datos repetidos en la misma tabla

Hola, mi problema es le siguiente. Tengo una tabla de rubros, la cual esta compuesta
por TCOD RUBCOD, RUBDESC.

El TCOD puede ser 'P' o 'H'. con el TCOD P SON RUBROS DE LOS CUALES MUCHOS NO SE USAN MAS, Y EN TCOD H ESTAN LOS ACTUALES, el problema es que necesito algunos rubros de 'P' que no estan en 'H'.

En resumen, quiero listar todos los rubros que estan en 'H' y a su vez los rubros que estan en 'P' pero no en H, y que no me muestre los repetidos.

La consulta que hice fue la siguiente:
SELECT R1.RUBCOD, R1.RUBDSC FROM RUB01 R1 WHERE R1.TPCOD = 'H' AND R1.RUBCOD NOT IN (SELECT DISTINCT R1.RUBCOD FROM GCI73.GCI.RUB01 R1 WHERE R1.TPCOD = 'H')

pero no me tira ningun resultado. Espero su ayuda. Gracias!
  #2 (permalink)  
Antiguo 12/05/2011, 10:33
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: No listar datos repetidos en la misma tabla

Algo así

Código SQL:
Ver original
  1. (SELECT TCOD, RUBCOD, RUBDESC
  2. FROM RUB01
  3. WHERE TCOD = 'H')
  4. UNION
  5. (SELECT TCOD, RUBCOD, RUBDESC
  6. FROM RUB01
  7. WHERE TCOD = 'P'
  8. AND RUBCOD NOT IN
  9. (SELECT RUBCOD FROM RUB01 WHERE TCOD = 'H'))
  #3 (permalink)  
Antiguo 12/05/2011, 10:38
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: No listar datos repetidos en la misma tabla

Hola patob:

Si hubieras puesto algunos datos de ejemplo sería más fácil entender perfectamente lo que quieres hacer y por lo tanto darte una respuesta un poco más acorde a lo que necesitas, pero a falta de esta información vamos a tratar de adivinar un poco.

Creo que la idea de Heimish2000 es correcta, pero ya en otras ocasiones se ha comentado que es mejor utilizar EXISTS que IN, además creo que no había necesidad de utilizar un UNION de dos consultas. Si no estoy equivocado podría hacerse con una sola consulta:

Voy a suponer que tu tabla RUBROS tiene más o menos la siguiente información.

Código:
TCOD RUBCOD      RUBDESC
---- ----------- ----------
H    1           uno
H    2           dos
H    3           tres
H    4           cuatro
H    5           cinco
P    3           tres
P    4           cuatro
P    6           seis
Si entendí bien lo que necesitas es mostrar los 5 registros que tienen TCOD = 'H' + el registro con TCOD = 'P' y RUBCOD = 6, ya que este rubro no se encuentra entre los H's.

En el caso de los P-3 y P-4 estos no se deben mostrar porque ya existen entre los H's correcto??? Para hacer esto podrías hacer lo siguiente:

Código SQL:
Ver original
  1. DECLARE @rubros TABLE (TCOD VARCHAR, RUBCOD INT, RUBDESC VARCHAR(10))
  2. INSERT INTO @rubros VALUES ('H',1,'uno');
  3. INSERT INTO @rubros VALUES ('H',2,'dos');
  4. INSERT INTO @rubros VALUES ('H',3,'tres');
  5. INSERT INTO @rubros VALUES ('H',4,'cuatro');
  6. INSERT INTO @rubros VALUES ('H',5,'cinco');
  7. INSERT INTO @rubros VALUES ('P',3,'tres');
  8. INSERT INTO @rubros VALUES ('P',4,'cuatro');
  9. INSERT INTO @rubros VALUES ('P',6,'seis');
  10. SELECT * FROM @rubros;
  11.  
  12. SELECT * FROM @rubros T1 WHERE TCOD = 'H' OR
  13. (TCOD = 'P' AND NOT EXISTS (
  14. SELECT * FROM @rubros T2
  15. WHERE T1.RUBCOD = T2.RUBCOD AND T2.TCOD = 'H'
  16. ))

El resultado de la consulta sería:
Código:
TCOD RUBCOD      RUBDESC
---- ----------- ----------
H    1           uno
H    2           dos
H    3           tres
H    4           cuatro
H    5           cinco
P    6           seis
Espero que esto te sea de utilidad. Si no es así te pido que nos pongas algunos datos de ejemplo y lo que esperas de salida, para poder hacer pruebas.

Saludos
Leo.

------------------------------------------------------
"La vida es como un eco: cuando das algo, esto te
retorna a ti multiplicado muchas, muchas veces."
Ley del Karma.
  #4 (permalink)  
Antiguo 12/05/2011, 10:57
 
Fecha de Ingreso: marzo-2011
Mensajes: 75
Antigüedad: 13 años, 1 mes
Puntos: 6
Respuesta: No listar datos repetidos en la misma tabla

Muchisimas gracias a los 2. Me quedo mas simple usar la consulta de Heimish2000 pero probe la tuya leonardo_josue y tambien funciono, para mi proxima consulta voy a explicarme mejor, pero es exactamente como los describiste leonardo_josue.
  #5 (permalink)  
Antiguo 12/05/2011, 11:35
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: No listar datos repetidos en la misma tabla

hola de nuevo patob:

Como te comenté en el post, la sugerencia de Heimish2000 era correcta. Mi comentario iba con la intención de tratar de mejorar el perfomance,

En este foro hemos discutido muchas veces acerca de qué consultas tienen mejor rendimiento, si utilizando IN o EXISTS o como es el caso hacer una consulta y poco más compleja o varias uniones sencillas. No sé qué tantos registros tengas en tu tabla, pero igual y sería interesante que ejecutaras ambas consultas y nos comentaras los tiempos de respuesta, para tener un parámetro de comparación. Igual y resulta que es más eficiente el modo en que plantea la consulta el compañero Heimish2000 que la consulta que pose yo.

De cualquier manera me alegra que hayas encontrado la solución.

Saludos
Leo.

Etiquetas: listar, repetidos, 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 06:56.