Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

MySQL - Consulta: "Tabla - Tabla?" (Resta de conjuntos)

1,479 views
Skip to first unread message

Juan Guillermo Fernández V.

unread,
Jun 29, 2004, 2:56:49 PM6/29/04
to
Hola, gente de mundo.

Me he topado con un problema que, probablemente, sea de principiantes; pero
que no he podido resolver (más por falta de tiempo pa' investigarlo que otra
cosa).

La cuestión es que tengo dos tablas, y necesito una consulta que me permita
obtener los registros (según índice) en la tabla 1 que NO ESTÉN en la tabla
2; o sea, una resta de conjuntos. El asunto es que quiero hacerlo en una
sola operación, pues -como sabrán- MySQL no soporta subqueries.

Asi que eso tan sólo. Por mientras seguiré investigando por mi cuenta; pero
si son tan amables de ayudarme, se los agradeceré.

¡Muchas gracias! ^-^

Adieu!


Cristian Gutierrez

unread,
Jun 29, 2004, 4:16:33 PM6/29/04
to
Juan Guillermo Fernández V. wrote:

[...]


> La cuestión es que tengo dos tablas, y necesito una consulta que me
> permita obtener los registros (según índice) en la tabla 1 que NO
> ESTÉN en la tabla 2; o sea, una resta de conjuntos. El asunto es que
> quiero hacerlo en una sola operación, pues -como sabrán- MySQL no
> soporta subqueries.

LEFT (o RIGHT) JOIN parece ser lo que necesitas.

Saludos,

--
Cristian Gutierrez http://www.dcc.uchile.cl/~crgutier
crgutier[@]dcc.uchile.cl Jabber:crgu...@jabber.org

"The reasonable man adapts himself to the world; the unreasonable one
persists in trying to adapt the world to himself. Therefore all progress
depends on the unreasonable man." -- C. A. R. Hoare, 1980 Turing Award Lectur

Myth

unread,
Jun 29, 2004, 4:38:41 PM6/29/04
to
select * from tabla1 where indice not in (select indice from tabla 2)

:-)

"Juan Guillermo Fernández V." <promodeus...@hotmail.com> escribió en
el mensaje news:cbse09$10h$1...@news1.nivel5.cl...

Cano

unread,
Jun 29, 2004, 6:12:07 PM6/29/04
to
esto no es una sub-query (no soportado por MySQL) ?


"Myth" <m1997_ok(borrame)@hotmail.com> escribió en el mensaje
news:cbsjg2$o16$1...@news.chilesat.net...

Hector Vergara R.

unread,
Jun 29, 2004, 7:59:41 PM6/29/04
to
El Tue, 29 Jun 2004 14:56:49 -0400, Juan Guillermo Fernández V.
<promodeus...@hotmail.com> escribió:

> Hola, gente de mundo.
>
> Me he topado con un problema que, probablemente, sea de principiantes;
> pero
> que no he podido resolver (más por falta de tiempo pa' investigarlo que
> otra
> cosa).
>
> La cuestión es que tengo dos tablas, y necesito una consulta que me
> permita
> obtener los registros (según índice) en la tabla 1 que NO ESTÉN en la
> tabla 2; o sea, una resta de conjuntos. El asunto es que quiero hacerlo
> en una
> sola operación, pues -como sabrán- MySQL no soporta subqueries.
>

SELECT
tabla1.*
FROM
tabla1
LEFT JOIN
tabla2
ON tabla1.id = tabla2.id
WHERE tabla2.id IS NULL

o sea, junta las dos consultas (dandole preferencia a la izquierda [LEFT])
y cuando no encuentre en la tabla 2 su correspondiente a la tabla 1, va a
entregar un valor null para tabla2.id

espero que te sirva, saludos

----------------------
Hector Vergara Reinoso
hver...@ing.uchile.cl

Francisco Javier Araya Maggiolo

unread,
Jun 29, 2004, 6:00:15 PM6/29/04
to
Cano wrote:
> esto no es una sub-query (no soportado por MySQL) ?
>
>
> "Myth" <m1997_ok(borrame)@hotmail.com> escribió en el mensaje
> news:cbsjg2$o16$1...@news.chilesat.net...
>
>>select * from tabla1 where indice not in (select indice from tabla 2)
>>
>>:-)
>>

Si, es una subquery, ojo que desde MySQL 4.1 estan soportadas, pero de
todas maneras no es lo mas optimo.

Saludos

Francisco

Juan Guillermo Fernández V.

unread,
Jun 29, 2004, 10:29:30 PM6/29/04
to
"Hector Vergara R." escribió:

>
> SELECT
> tabla1.*
> FROM
> tabla1
> LEFT JOIN
> tabla2
> ON tabla1.id = tabla2.id
> WHERE tabla2.id IS NULL
>
> o sea, junta las dos consultas (dandole preferencia a la izquierda [LEFT])
> y cuando no encuentre en la tabla 2 su correspondiente a la tabla 1, va a
> entregar un valor null para tabla2.id
>
> espero que te sirva, saludos

Al final, algo de eso hice. El "super-select" (que resultó enorme) me quedó
al final:

SELECT venta_ano,
ventas.cod_producto,
cod_cliente,
id_empresa,
venta_mes_1,
venta_mes_2,
venta_mes_3,
venta_mes_4,
venta_mes_5,
venta_mes_6,
venta_mes_7,
venta_mes_8,
venta_mes_9,
venta_mes_10,
venta_mes_11,
venta_mes_12,
If (ingreso_mes_1 IS NULL, venta_mes_1 * (suma_ingresos/suma_ventas),
ingreso_mes_1) AS ingreso_mes_1,
If (ingreso_mes_2 IS NULL, venta_mes_2 * (suma_ingresos/suma_ventas),
ingreso_mes_2) AS ingreso_mes_2,
If (ingreso_mes_3 IS NULL, venta_mes_3 * (suma_ingresos/suma_ventas),
ingreso_mes_3) AS ingreso_mes_3,
If (ingreso_mes_4 IS NULL, venta_mes_4 * (suma_ingresos/suma_ventas),
ingreso_mes_4) AS ingreso_mes_4,
If (ingreso_mes_5 IS NULL, venta_mes_5 * (suma_ingresos/suma_ventas),
ingreso_mes_5) AS ingreso_mes_5,
If (ingreso_mes_6 IS NULL, venta_mes_6 * (suma_ingresos/suma_ventas),
ingreso_mes_6) AS ingreso_mes_6,
If (ingreso_mes_7 IS NULL, venta_mes_7 * (suma_ingresos/suma_ventas),
ingreso_mes_7) AS ingreso_mes_7,
If (ingreso_mes_8 IS NULL, venta_mes_8 * (suma_ingresos/suma_ventas),
ingreso_mes_8) AS ingreso_mes_8,
If (ingreso_mes_9 IS NULL, venta_mes_9 * (suma_ingresos/suma_ventas),
ingreso_mes_9) AS ingreso_mes_9,
If (ingreso_mes_10 IS NULL, venta_mes_10* (suma_ingresos/suma_ventas),
ingreso_mes_10) AS ingreso_mes_10,
If (ingreso_mes_11 IS NULL, venta_mes_11* (suma_ingresos/suma_ventas),
ingreso_mes_11) AS ingreso_mes_11,
If (ingreso_mes_12 IS NULL, venta_mes_12* (suma_ingresos/suma_ventas),
ingreso_mes_12) AS ingreso_mes_12,
If (costo_mes_1 IS NULL, venta_mes_1 * (suma_costos/suma_ventas),
costo_mes_1) AS costo_mes_1,
If (costo_mes_2 IS NULL, venta_mes_2 * (suma_costos/suma_ventas),
costo_mes_2) AS costo_mes_2,
If (costo_mes_3 IS NULL, venta_mes_3 * (suma_costos/suma_ventas),
costo_mes_3) AS costo_mes_3,
If (costo_mes_4 IS NULL, venta_mes_4 * (suma_costos/suma_ventas),
costo_mes_4) AS costo_mes_4,
If (costo_mes_5 IS NULL, venta_mes_5 * (suma_costos/suma_ventas),
costo_mes_5) AS costo_mes_5,
If (costo_mes_6 IS NULL, venta_mes_6 * (suma_costos/suma_ventas),
costo_mes_6) AS costo_mes_6,
If (costo_mes_7 IS NULL, venta_mes_7 * (suma_costos/suma_ventas),
costo_mes_7) AS costo_mes_7,
If (costo_mes_8 IS NULL, venta_mes_8 * (suma_costos/suma_ventas),
costo_mes_8) AS costo_mes_8,
If (costo_mes_9 IS NULL, venta_mes_9 * (suma_costos/suma_ventas),
costo_mes_9) AS costo_mes_9,
If (costo_mes_10 IS NULL, venta_mes_10* (suma_costos/suma_ventas),
costo_mes_10) AS costo_mes_10,
If (costo_mes_11 IS NULL, venta_mes_11* (suma_costos/suma_ventas),
costo_mes_11) AS costo_mes_11,
If (costo_mes_12 IS NULL, venta_mes_12* (suma_costos/suma_ventas),
costo_mes_12) AS costo_mes_12
FROM ventas LEFT JOIN temp_ventas
ON ventas.cod_producto = temp_ventas.cod_producto
GROUP BY cod_producto, cod_cliente, venta_ano, id_empresa
HAVING (Length(ventas.cod_producto)>=6)
AND (cod_cliente BETWEEN 0 AND 1)
AND (venta_ano!='')

Incluyo el código completo del select pa' que vean lo que uno tiene que
hacer cuando hay que migrar bases de datos mal diseñadas ¬_¬''' Asi que,
niños. Cuando diseñen una base de datos, pónganle pino, que más adelante
algún pelota ya se las verá tartando de migrarla :P

Ahora, imagínense el tiempo que toma en efectuarse este query....


Francisco Javier Araya Maggiolo

unread,
Jun 29, 2004, 4:01:06 PM6/29/04
to
Juan Guillermo Fernández V. wrote:

Hola, es super facil, utiliza LEFT JOIN (join por la izquierda), por
ejemplo:

SELECT * FROM tabla1 LEFT JOIN tabla2 ON tabla1.id=tabla2.id WHERE
tabla2.id IS NULL;

Donde 'id' de 'tabla2' es el campo que deseas verificar que sea nulo,
porque no existe.

Mas info en http://dev.mysql.com/doc/mysql/en/JOIN.html


Saludos

Francisco

0 new messages