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

Consulta en dos tablas

Estas en el tema de Consulta en dos tablas en el foro de SQL Server en Foros del Web. Bueno amigos este es mi primer mensaje en el foro, lastima que sea por un problema aca va: Tengo dos tablas(en realidad tres pero creo ...
  #1 (permalink)  
Antiguo 25/02/2008, 02:21
 
Fecha de Ingreso: febrero-2008
Mensajes: 4
Antigüedad: 16 años, 2 meses
Puntos: 0
Consulta en dos tablas

Bueno amigos este es mi primer mensaje en el foro, lastima que sea por un problema aca va:

Tengo dos tablas(en realidad tres pero creo que una no interviene)

y son estas

t_variacion (vari_id, vari_desc)

t_materia_prima (mtpi_id, mtpi_desc, mtpi_modo)

t_materia_prima_variacion (mtpv_id, mtpv_mtpi_id, mtpi_vari_id)



para que me entiendan de estas tres tablas seria este: una materia prima "piedra", (1,'piedra')

variacion podria ser por ejemplo "forma", "tamano","color" (1,'tamano')

y la union de estas tablas me generaria algo asi: id, materia_id, variacion_id (1,1,1)


Necesito hacer una consulta, que me devuelva los registros de la tabla variacion que no han sido usados aun por una materia prima.

Por ejemplo, tengo estas variaciones "tamano", "color", "calidad", pero "piedra"(materia prima) solo tiene asociada la variacion "tamano", entonces la consulta deberia arrojarme como resultado "color" y "calidad".

Disculpen si me esoty haciendo una tormenta en un vaso de agua con esta consulta, pero no la puedo resolver, espero que uds. puedan ayudarme.


Saludos, quedo esperando la respuesta
  #2 (permalink)  
Antiguo 25/02/2008, 14:44
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Consulta en dos tablas

Lo que entiendo es que la consulta te interesa para un producto determinado ¿no? En ese caso, sólo hay que aparear t_variacion con las variaciones ya existentes para el producto en t_materia_prima_variacion usando un left join.
Código:
SELECT      vari_desc
FROM        t_variacion AS v
LEFT JOIN   t_materia_prima_variacion AS mpv
            ON mpv.mtpv_vari_id = v.vari_id
            AND mpv.mtpv_mtpi_id = 1
WHERE       mpv.mtpv_vari_id IS NULL 
En el caso de que quieras obtener para todos los productos, o para un grupo determinado de ellos, tu mejor opcion es un cross join para obtener todas las combinaciones posibles, y luego un left join para excluir las ya existentes.
Código:
SELECT      cmb.mtpi_desc, cmb.vari_desc
FROM (
                SELECT      mp.mtpi_id,
                            mp.mtpi_desc,
                            v.vari_id,
                            v.vari_desc
                FROM        t_materia_prima AS mp
                CROSS JOIN  t_variacion AS v
            ) AS cmb        --Todas las posibles combinaciones
LEFT JOIN   t_materia_prima_variacion AS mpv
            ON mpv.mtpv_mtpi_id = cmb.mtpi_id
            AND mpv.mtpv_vari_id = cmb.vari_id
WHERE       mpv.mtpv_mtpi_id IS NULL 
  #3 (permalink)  
Antiguo 27/02/2008, 14:40
 
Fecha de Ingreso: febrero-2008
Mensajes: 4
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Consulta en dos tablas

gracias con la primera query me basto, la segunda me salta un error, pero muchas gracias por tu ayuda, ahora si me explicas como llegaste a ellas, quedaria encantado.
  #4 (permalink)  
Antiguo 28/02/2008, 22:17
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Consulta en dos tablas

Bueno, básicamente lo que solicitas es una diferencia de conjuntos. Quieres de un conjunto A (t_variacion) todo aquello que no está en B (t_materia_prima_variacion) usando como comparación los ID's de las variaciones. La forma clásica de implementarlo es con un LEFT JOIN.
También puede en este caso implementarse con un INNER JOIN usando como comparación un <>. No es algo usual ya que típicamente se usa un equijoin.
Código:
SELECT      v.vari_desc
FROM        t_variacion AS v
INNER JOIN   t_materia_prima_variacion AS mpv
            ON mpv.mtpv_vari_id <> v.vari_id
            AND mpv.mtpv_mtpi_id = 1
El segundo query creo que es sintácticamente correcto. No encuentro una razón para que ocurra un error, salvo que alguno de los nombres de las columnas esté mal.
Sin embargo la lógica es simple. Obtienes todas las combinaciones posibles y de estas presentas sólo aquellas que no existan en t_materia_prima_variacion. Es otra diferencia de conjuntos.
No es la única solución y de hecho analizando aún más no es la mejor. Extendiendo el query arriba presentado, puedes obtener para varias materias primas las variaciones faltantes:
Código:
SELECT      mp.mtpi_desc, v.vari_desc
FROM        t_variacion AS v
INNER JOIN   t_materia_prima_variacion AS mpv
            ON mpv.mtpv_vari_id <> v.vari_id
INNER JOIN  t_materia_prima as mp
            ON mp.mtpi_id = mpv.mtpv_mtpi_id
WHERE mp.mtpi_id IN (1,2,3,4)
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 11:38.