Ayuda con INNER JOIN 3 tablas
Publicado por Modesto Hernández (1 intervención) el 06/09/2011 19:34:29
Hola a tod@s!!
Mi problema es el siguiente. Tengo tres tablas, clientes_datos donde se guardan los datos personales de los clientes, gestion_ventas_cabecera donde se guardan los datos de la cabecera de una venta y gestion_ventas_lineas donde se guarda cada artículo vendido con su precio y que hacen referencia a una venta, Es decir, en gestión_ventas_cabecera aparecerá algo como, fecha de la venta, nº de ticket y codigo_cliente del comprador y en la tabla gestion_ventas_lineas aparecerán tantas tuplas como articulos vendidos tenga esa venta, Por ejemplo, ticket nº 234 tendrá n apariciones con gestion_ventas_lineas: 234 pantalon 60€ , 234 camisa 25€ y así.
Lo que necesito sacar son los datos de los clientes (clientes_datos) que han realizado compras en una determinada fecha. La relación entre las tablas es la siguiente:
clientes_datos :
-> codigo_cliente
gestion_ventas_cabecera :
-> numero_cliente Referencia a codigo_cliente (clientes_datos)
-> numero_ticket
-> tienda
gestion_ventas_lineas:
-> numero_ticket Referencia a numero_ticket (gestion_ventas_cabecera)
-> tienda Referencia a tienda (gestion_ventas_cabecera)
Mi select inicial es esta:
SELECT cd.codigo_cliente, cd.apellidos_cliente, cd.nombre_cliente, gvc1.fecha
FROM clientes_datos cd, gestion_ventas_cabecera gvc1
WHERE cd.codigo_cliente IN (
SELECT gvc.numero_cliente
FROM gestion_ventas_cabecera gvc
INNER JOIN gestion_ventas_lineas gvl
ON (gvc.numero_ticket = gvl.numero_ticket)
AND (gvc.tienda = gvl.tienda)
WHERE (gvc.fecha BETWEEN '2010-01-01' AND '2010-01-31')
)
GROUP BY cd.codigo_cliente
ORDER BY cd.apellidos_cliente
Pero esta select es muy pesada y tarda más de 2min en ejecutarse, algo estoy haciendo mal. Sólo me pasa cuando intento que la Select me recupere el dato fecha de la tabla gestion_ventas_cabecera que es la fecha de la compra. Si no quisiera devolver ese campo la select tarda apenas 4 o 5 segs en devolver el resultado. No sé qué hago mal.
He intentado hacerlo a lo bruto usando tres inner_join seguidos, pero igualmente tarda una eternidad con la siguiente select usando el asistente:
SELECT
clientes_datos.codigo_cliente,
clientes_datos.apellidos_cliente,
clientes_datos.nombre_cliente,
gestion_ventas_cabecera.fecha
FROM
clientes_datos
INNER JOIN gestion_ventas_cabecera ON (clientes_datos.codigo_cliente = gestion_ventas_cabecera.numero_cliente)
INNER JOIN gestion_ventas_lineas ON (gestion_ventas_cabecera.numero_ticket = gestion_ventas_lineas.numero_ticket)
AND (gestion_ventas_cabecera.optica = gestion_ventas_lineas.optica)
WHERE
gestion_ventas_cabecera.fecha BETWEEN '2010-01-01' AND '2010-01-31'
Muchas gracias!
Mi problema es el siguiente. Tengo tres tablas, clientes_datos donde se guardan los datos personales de los clientes, gestion_ventas_cabecera donde se guardan los datos de la cabecera de una venta y gestion_ventas_lineas donde se guarda cada artículo vendido con su precio y que hacen referencia a una venta, Es decir, en gestión_ventas_cabecera aparecerá algo como, fecha de la venta, nº de ticket y codigo_cliente del comprador y en la tabla gestion_ventas_lineas aparecerán tantas tuplas como articulos vendidos tenga esa venta, Por ejemplo, ticket nº 234 tendrá n apariciones con gestion_ventas_lineas: 234 pantalon 60€ , 234 camisa 25€ y así.
Lo que necesito sacar son los datos de los clientes (clientes_datos) que han realizado compras en una determinada fecha. La relación entre las tablas es la siguiente:
clientes_datos :
-> codigo_cliente
gestion_ventas_cabecera :
-> numero_cliente Referencia a codigo_cliente (clientes_datos)
-> numero_ticket
-> tienda
gestion_ventas_lineas:
-> numero_ticket Referencia a numero_ticket (gestion_ventas_cabecera)
-> tienda Referencia a tienda (gestion_ventas_cabecera)
Mi select inicial es esta:
SELECT cd.codigo_cliente, cd.apellidos_cliente, cd.nombre_cliente, gvc1.fecha
FROM clientes_datos cd, gestion_ventas_cabecera gvc1
WHERE cd.codigo_cliente IN (
SELECT gvc.numero_cliente
FROM gestion_ventas_cabecera gvc
INNER JOIN gestion_ventas_lineas gvl
ON (gvc.numero_ticket = gvl.numero_ticket)
AND (gvc.tienda = gvl.tienda)
WHERE (gvc.fecha BETWEEN '2010-01-01' AND '2010-01-31')
)
GROUP BY cd.codigo_cliente
ORDER BY cd.apellidos_cliente
Pero esta select es muy pesada y tarda más de 2min en ejecutarse, algo estoy haciendo mal. Sólo me pasa cuando intento que la Select me recupere el dato fecha de la tabla gestion_ventas_cabecera que es la fecha de la compra. Si no quisiera devolver ese campo la select tarda apenas 4 o 5 segs en devolver el resultado. No sé qué hago mal.
He intentado hacerlo a lo bruto usando tres inner_join seguidos, pero igualmente tarda una eternidad con la siguiente select usando el asistente:
SELECT
clientes_datos.codigo_cliente,
clientes_datos.apellidos_cliente,
clientes_datos.nombre_cliente,
gestion_ventas_cabecera.fecha
FROM
clientes_datos
INNER JOIN gestion_ventas_cabecera ON (clientes_datos.codigo_cliente = gestion_ventas_cabecera.numero_cliente)
INNER JOIN gestion_ventas_lineas ON (gestion_ventas_cabecera.numero_ticket = gestion_ventas_lineas.numero_ticket)
AND (gestion_ventas_cabecera.optica = gestion_ventas_lineas.optica)
WHERE
gestion_ventas_cabecera.fecha BETWEEN '2010-01-01' AND '2010-01-31'
Muchas gracias!
Valora esta pregunta


0