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!
[...]
> 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
:-)
"Juan Guillermo Fernández V." <promodeus...@hotmail.com> escribió en
el mensaje news:cbse09$10h$1...@news1.nivel5.cl...
"Myth" <m1997_ok(borrame)@hotmail.com> escribió en el mensaje
news:cbsjg2$o16$1...@news.chilesat.net...
> 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
Si, es una subquery, ojo que desde MySQL 4.1 estan soportadas, pero de
todas maneras no es lo mas optimo.
Saludos
Francisco
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....
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