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

[SOLUCIONADO] Consulta de tabla sin coincidencias

Estas en el tema de Consulta de tabla sin coincidencias en el foro de SQL Server en Foros del Web. Hola me pueden ayudar con una consulta que tengo que hacer en un procedimiento almacenado. Necesito el nombre de las especies que nunca fueron capturadas ...
  #1 (permalink)  
Antiguo 21/05/2014, 21:41
 
Fecha de Ingreso: mayo-2014
Mensajes: 4
Antigüedad: 9 años, 11 meses
Puntos: 0
Consulta de tabla sin coincidencias

Hola me pueden ayudar con una consulta que tengo que hacer en un procedimiento almacenado.

Necesito el nombre de las especies que nunca fueron capturadas por un barco para ello usare las siguientes tablas.

DETALLE FAENA

COD_FAE(FK) // COD_ESP(FK) // CAN_REC

F01 S03 120
F01 S05 300

ESPECIE

COD_ESP (PK) // NOM_ESP

S01 ATUN
s02 corvina
s03 ballena azul
s04 pez espada
s05 anchoveta

LA CONSULTA QUE QUIERO COMO RESULTADO ES

COD_FAE / COD_ESP

f01 s01
f01 s02
f01 s04
  #2 (permalink)  
Antiguo 22/05/2014, 10:29
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: Consulta de tabla sin coincidencias

Simple, es un NOT EXISTS

Código SQL:
Ver original
  1. SELECT COD_ESP FROM ESPECIE esp WHERE NOT EXISTS
  2. (SELECT * FROM FAENA fae WHERE fae.COD_ESP = esp.COD_ESP)
__________________
MCTS Isaias Islas

Última edición por iislas; 22/05/2014 a las 10:51
  #3 (permalink)  
Antiguo 22/05/2014, 15:39
 
Fecha de Ingreso: mayo-2014
Mensajes: 4
Antigüedad: 9 años, 11 meses
Puntos: 0
Respuesta: Consulta de tabla sin coincidencias

Gracias por su pronta respuesta pero no obtengo el resultado obtenido. Ya que mi tabla detalle_faena tiene otras faenas y solo me da las especies que nunca han sido capturadas por todas.
Debí agregar el detalle que cada faena pertenece a un barco en especifico.

AGREGANDO A LAS TABLAS ANTERIORES:

DETALLE FAENA

COD_FAE(FK) // COD_ESP(FK) // CAN_REC

F01 S03 120
F01 S05 300
F02 S01 50
F02 S04 30
F03 S02 100
F03 S07 170

ESPECIE

COD_ESP (PK) // NOM_ESP

S01 ATUN
s02 corvina
s03 ballena azul
s04 pez espada
s05 anchoveta
s06 bacalao
s07 ballena

LA CONSULTA QUE QUIERO COMO RESULTADO ES

COD_FAE / COD_ESP

f01 s01
f01 s02
f01 s04

Con la consulta que me mando el sql server me devuelve

s06 pues es la especie que no ha sido usada en ninguna faena.
  #4 (permalink)  
Antiguo 22/05/2014, 16:23
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: Consulta de tabla sin coincidencias

esto soluciona tu problema:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. cod_fae VARCHAR(20),
  4. cod_esp VARCHAR(20),
  5. can_rec INT
  6. )
  7.  
  8. INSERT INTO #temp VALUES ('F01','S03',120)
  9. INSERT INTO #temp VALUES ('F01','S05',300)
  10. INSERT INTO #temp VALUES ('F02','S01',50)
  11. INSERT INTO #temp VALUES ('F02','S04',30)
  12. INSERT INTO #temp VALUES ('F03','S02',100)
  13. INSERT INTO #temp VALUES ('F03','S07',170)
  14.  
  15.  
  16. CREATE TABLE #temp2
  17. (
  18. cod_esp VARCHAR(20),
  19. nom_esp VARCHAR(20)
  20. )
  21.  
  22. INSERT INTO #temp2 VALUES ('S01','ATUN')
  23. INSERT INTO #temp2 VALUES ('s02','corvina')
  24. INSERT INTO #temp2 VALUES ('s03','ballena azul')
  25. INSERT INTO #temp2 VALUES ('s04','pez espada')
  26. INSERT INTO #temp2 VALUES ('s05','anchoveta')
  27. INSERT INTO #temp2 VALUES ('s06','bacalao')
  28. INSERT INTO #temp2 VALUES ('s07','ballena')
  29.  
  30. SELECT * FROM(
  31. SELECT * FROM(
  32. SELECT DISTINCT cod_fae FROM #temp
  33. ) AS t1,#temp2
  34. ) AS t3
  35. WHERE cod_fae + cod_esp NOT IN(
  36. SELECT t1.cod_fae + t2.cod_esp FROM #temp AS t1
  37. LEFT JOIN #temp2 AS t2 ON (t1.cod_esp=t2.cod_esp)
  38. )

si me preguntas porque uso #temp entonces si estamos en el hoyo ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 22/05/2014, 17:04
 
Fecha de Ingreso: mayo-2014
Mensajes: 4
Antigüedad: 9 años, 11 meses
Puntos: 0
Respuesta: Consulta de tabla sin coincidencias

Gracias libras me funciono excelente.
Por ultimo me gustaria que expliques como llegaste a la solucion pues nunca habia utilizado
Cita:
WHERE cod_fae + cod_esp
y porque realizas un left join y el distinct.

Última edición por zitsaga; 22/05/2014 a las 17:12 Razón: Me falto terminar el mensaje
  #6 (permalink)  
Antiguo 22/05/2014, 19: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: Consulta de tabla sin coincidencias

Cita:
Iniciado por zitsaga Ver Mensaje
Gracias libras me funciono excelente.
Por ultimo me gustaria que expliques como llegaste a la solucion pues nunca habia utilizado
y porque realizas un left join y el distinct.
a ver te lo trato de explicar:

Código SQL:
Ver original
  1. SELECT * FROM(
  2. SELECT DISTINCT cod_fae FROM #temp
  3. ) AS t1,#temp2

aqui obtengo los codigos distintos en este caso F01,f02 y f03 y hago un producto cruzado con la tabla de faena para obtener

f01 s01
f01 s02
f01 s03
.
.
.
f01s06

para cada uno de los casos, ya despues con esto:

Código SQL:
Ver original
  1. SELECT t1.cod_fae + t2.cod_esp FROM #temp AS t1
  2. LEFT JOIN #temp2 AS t2 ON (t1.cod_esp=t2.cod_esp)

obtengo los que tienen relacion entre las tablas....y con eso ya hago esto
valor1 + valor2 que significa que concatena los 2 valores y los compara.....este es un pequeño "truco" para obtener los datos en un in usando 2 columnas....

espero haberme explicado :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: coincidencias, siguiente, 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 23:18.