Consulta con operador IN

Tengo una pregunta y ojala me puedas ayudar a resolverla, estoy elaborando una consulta a la bd que elabore pero cuando quiero obtener los resultados de dos registros en especifico no me sale. Ejemplo:
Si elaboro la siguiente consulta me salen 20 reg
select campo1, campo2, campo3
from tabla1 t1, tabla2 t2
where t1.id = t2.id and campo3 = 'regX'
________________________________________________________________________
Pero si la elaboro de la siguiente forma me salen 15 reg
select campo1, campo2, campo3
from tabla1 t1, tabla2 t2
where t1.id = t2.id and campo3 in ('regX', 'regY')
Gropu by campo4
No se por que omite los otros 5 registros si se supone que quieres combinar los dos registros que estas poniendo dentro del IN. También me he dado cuenta que cuando cambio el campo en el group by se obtienen diferentes resultados pero no he conseguido un poner un campo en el cual obtenga los mismos registros.

2 Respuestas

Respuesta
1
Si no has copiado mal las consultas que estás haciendo, la primera de ellas no lleva GROUP BY. Ese agrupamiento que haces en la segunda y no en la primera es la razón de que nunca obtengas el mismo numero de registros.
Las consultas
select campo1, campo2, campo3
from tabla1 t1, tabla2 t2
where t1.id = t2.id and campo3 = 'regX'
y
select campo1, campo2, campo3
from tabla1 t1, tabla2 t2
where t1.id = t2.id and campo3 in ('regX', 'regY')
(sin group by), si son comparables. De hecho, según están, la segunda obtendrá siempre más registros que la primera, o como mínimo los mismos, si no hubiera ningún registro con el valor 'regY' en el campo campo3.
Pero si en una consulta agrupas y en la otra no, no puedes esperar que el número de registros guarde alguna relación. De hecho, según las estás haciendo, los 15 registros que dices que te devuelve la segunda consulta agrupada, significa que hay 15 valores distintos del campo campo4.
Espero haberte ayudado, y si has copiado mal las consultas y faltaba algo, ponlo y te responderé.
Si con esta respuesta te sirve.
Creo que si copie mal la consulta por que de hecho me hizo falta algo:
select campo1, campo2, campo3
from tabla1 t1, tabla2 t2
where t1.id = t2.id and campo3 = 'regX'
________________________________________________________________________
select campo1, campo2, campo3, sum(campo4)
from tabla1 t1, tabla2 t2
where t1.id = t2.id and campo3 in ('regX', 'regY')
group by campo4
Es por eso que en la segunda consulta me salen menos. Saludos
Si, es por el group by.
Aunque en la segunda consulta la condición where es menos restrictiva (in en lugar de igual a), en esta segunda te esta sacando una fila por cada combinación de campo1+campo2+campo3 diferente, mientras que en la primera las saca todas.
O agrupas en ambas, o en ninguna. En cualquiera de los dos casos podrás comprobar que la segunda consulta devilvera como mínimo el mismo numero de filas que la primera. Según las tienes, no son comparables.
Respuesta
1
Alexsnake:
La segunda consulta está mala, porque cuando haces un group by los campos 1, 2 y 3 deben tener alguna función de agregación (sum, count, max, etc.). Si asumo que campo1, 2 y 3 operan con funciones de agregación, entonces sí es válido que devuelva menos registros, porque recuerda que estás agrupando.
Lo mejor en este caso es hacer JOINS, por ejemplo:
select tabla1.campo1, tabla1.campo2, tabla2.campo3 from tabla1 inner join tabla2 on tabla1.id = tabla2.id where campo3 in ('regX', 'regY')
Esta consulta puede devolverte 20 o menos registros, todo depende si todos los tabla2. Id están en tabla1. Id
Si tienes el caso en que no todos los tabla2. Id están en tabla1. id, puedes usar LEFT OUTER JOIN en vez de INNER JOIN. Por el otro lado, si no todos los tabla1. Id están en tabla2. id, puedes usar RIGHT OUTER JOIN.
Ahora, si tienes un mix de los casos anteriores, es decir, si no todos los tabla1. Id están en tabla2. Id Y no todos los tabla2. Id están en tabla1. id, puedes usar FULL JOIN.
Si posteas la consulta real, te puedo ayudar más.
Es verdad tienes razón, se me olvido poner algo en la consulta, pero te lo mostrare como tal:
select noment, nompla, nomubi, artdes, cveinv, sum(pza)as Suma
from ent e, pla p, ubi u, inv i
where p.cveent=e.cveent and i.cvepla=p.cvepla and i.cveubi=u.cveubi and artdes like ('%mon%') and nomubi in ('Fiscal', 'Despacho')
group by noment, nompla, nomubi, cveinv
order by noment, nompla
Gracias por la ayuda.
Saludos
Cuando se escriben consultas anidadas, siempre es conveniente nombrar las tablas de donde vienen las columnas (al ojo voy a escribir la consulta y pensando que es SQL Server):
select ent.noment, pla.nompla, ubi.nomubi, inv.artdes, inv.cveinv, sum(inv.pza) as Suma
from ent
inner join pla
on ent.cveent = pla.cveent
inner join ubi
on pla.cvepla = ubi.cvepla
inner join inv
on ubi.cveubi = inv.cveubi
where inv.artdes like '%mon%' and ubi.nomubi in ('Fiscal', 'Despacho')
group by ent.noment, pla.nompla, ubi.nomubi, inv.artdes, inv.cveinv
order by ent.noment, pla.nompla
Esto te tiene que dar como tú quieres, pero recuerda que en este caso, no te saldrán artículos (artdes) que no tengan una ubicación (ubi) asociada; y así sucesivamente hacia arriba, hasta llegar a entidad (ent). Si no sale como quieres, puedes ver como funciona con LEFT OUTER o FULL.
Otro concepto un poquito más avanzado es el HAVING que es el WHERE del GROUP. Por ejemplo, si quisieras traer la misma consulta, pero sólo aquellos registros que la suma de piezas sean mayores que 10, puedes agregar entre el GROUP BY ... y el ORDER BY ... lo siguiente:
GROUP BY ...
HAVING SUM(inv.pza) > 10
ORDER BY ...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas