Consulta muy lenta

25/04/2005 - 19:27 por manolo | Informe spam
Hola,

Tengo una consulta que se ejecuta muy lenta.
Mi idea es unir 6 tablas y este es más o menos el resumen:

Albaranes.IdAlbaran, Albaranes.idCliente
Facturas.IdFactura, Facturas.idCliente
Tickets.idTicket, Tickets.idCliente
Detalles.idAlbaran, Detalles.idFactura, Detalles.idTicket,
Detalles.idArticulo
Articulos.idArticulo
Clientes.idCliente

Pues bien, quiero hacer una vista que muestre todos los movimientos de
artículos según el detalle.
Un detalle puede formar parte de un albarán, de un albarán y una
factura, de una factura, de un ticket y una factura o de un ticket, por lo
cual hago las uniones con right join.
Para devolver el cliente, utilizo la función coalesce, que devuelve el
primer valor no nulo de una lista de valores. Pues es en esta línea donde se
relentiza mucho la consulta, tarda de 5 a 10 minutos con unos 20000
registros y si le quito la línea es casi instantánea.
La línea en cuestión es:

from ...
inner join Clientes on Clientes.idCliente = coalesce(Albaranes.idCliente,
Facturas.idCliente, Tickets.idCliente)

¿Existe otra ffunción o existe otro modo de solucionar la velocidad?

Muchas gracias, perdón por el sermón y un saludo.

P.D. para facilitar la lectura, he omitido algunas tablas, he cambiado los
nombres de las tablas y de los campos. la consulta completa es:

select Articulos.Codigo as codArticulo,
rtrim(Articulos.Descripcion + ' ' + Tallas.Descripcion + ' ' +
Colores.Descripcion) as descripcion,
Articulos.cInterno,
DetallesAlbaranesVentas.Cantidad,
DetallesAlbaranesVentas.Precio,
DetallesAlbaranesVentas.Tipo,
DetallesAlbaranesVentas.Ejercicio,
coalesce(AlbaranesVentas.Cliente, FacturasVentas.Cliente,
TicketsVentas.Cliente) as Cliente,
coalesce(AlbaranesVentas.FechaAlbaran, FacturasVentas.FechaFactura,
TicketsVentas.FechaTicket) as Fecha,
convert(nvarchar(16), AlbaranesVentas.numAlbaran) as numAlbaran,
FacturasVentas.numFactura,
TicketsVentas.NumTicket,
Clientes.RazonSocial
from Articulos left join Tallas on articulos.talla = tallas.Codigo left join
colores on articulos.color = colores.codigo
inner join DetallesAlbaranesVentas on Articulos.Codigo =
DetallesAlbaranesVentas.codArticulo
left join AlbaranesVentas on DetallesAlbaranesVentas.numAlbaran =
AlbaranesVentas.numAlbaran and DetallesAlbaranesVentas.Ejercicio =
AlbaranesVentas.Ejercicio and DetallesAlbaranesVentas.Serie =
AlbaranesVentas.Serie
left join FacturasVentas on DetallesAlbaranesVentas.numFactura =
FacturasVentas.numFactura and DetallesAlbaranesVentas.EjercicioFacturas =
FacturasVentas.Ejercicio and DetallesAlbaranesVentas.Serie =
FacturasVentas.Serie
left join TicketsVentas on DetallesAlbaranesVentas.numTicket =
TicketsVentas.numTicket and DetallesAlbaranesVentas.EjercicioFacturas =
TicketsVentas.Ejercicio and DetallesAlbaranesVentas.Serie =
TicketsVentas.Serie
inner join Clientes on Clientes.Codigo = coalesce(AlbaranesVentas.Cliente,
FacturasVentas.Cliente, TicketsVentas.Cliente)

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
25/04/2005 - 20:51 | Informe spam
Correccion,

...
Una para sacar la informacion desde AlbaranesVentas.
...

La primera sentencia debe incluir todas las filas desde AlbaranesVentas. La
segunda solo las facturas que no estan asociadas a una fila en
AlbaranesVentas y la tercera la info desde TicketsVentas que no tienen
asociada una fila en AlbaranesVentas y FacturasVentas.


AMB

"Alejandro Mesa" wrote:

Manolo,

Crea tres sentencias. Una para sacar la informacion desde AlbaranesVentas,
para aquellos que no tengan factura o ticket asociados. Una segunda que saca
la informacion desde FacturasVentas, pero solo aquellas facturas que no
tengan filas asociadas en AlbaranesVentas y TicketsVentas. Una tercera para
seleccionar info desde TicketsVentas, solo aquellas filas que no tengan
asociadas una fila en AlbaranesVentas y FacturasVentas. entonces puedes hacer
la union de las tres.


AMB

"manolo" wrote:

> Hola Jose Mariano,
>
> El caso es que de esta forma me daría datos duplicados.
>
> Cuando creo un albarán, creo un registro en la tabla Albaranes y un
> registro por artículo del albarán en la tabla detalles.
> Cuando creo una factura de este albarán, lo único que hago en la tabla
> detalles es ponerle el número de factura al campo idFactura.
> De la misma forma, puedo crear una factura que no proceda de un albarán,
> por lo cual el campo idAlbaran puede ser nulo.
> Es por esto por lo que no puedo hacer una unión. los campos resumidos
> que me debe devolver la consulta son:
>
> Artículo, Cliente, nº Factura, nº Albarán, nº Ticket, Fecha factura,
> Fecha albarán, Fecha Ticket, Cantidad, Precio.
>
> De este modo de un vistazo podría ver en que fechas, documentos y precio
> se vendió un artículo, haciendo sum, la cantidad que se ha vendido, uniendo
> esta consulta con un union a otra consulta de compras ver el stock actual de
> los artículos, etc...
>
> Gracias y un saludo.
>
> "Jose Mariano Alvarez" escribió en el mensaje
> news:
> > Sugiero si te sirve que pruebes con UNION en lugar de los LEFT JOIN.
> >
> > Select 1
> > UNION
> > Select 2
> > UNION
> > Select 3
> >
> > Saludos
> > Jose Mariano
> >
>
>
>
Respuesta Responder a este mensaje
#7 manolo
26/04/2005 - 09:48 | Informe spam
Hola Alejandro,

¿Y como podría con un union sacar en una fila los documentos que
contienen un artículo?
Es decir, a mi cliente le interesa saber de un artículo, las salidas y
entradas que ha tenido y en los documentos que ha salido. por ejemplo, aquí
te mando un movimiento de un artículo:
Perdón por e formato de salida.

Select * from ListaSeguimientoArticulos where codArticulo = 1 order by
Ejercicio, numFactura


1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 .1540 1 2002 0 2002-11-20
00:00:00.000 1 NULL NULL CLIENTE DE CONTADO
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 30.0000 3.6400 1 2003 620 2003-01-10
00:00:00.000 57 41 NULL MANUEL MEDINILLA CARRASCO
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 30.0000 2.6200 1 2003 605 2003-01-14
00:00:00.000 90 56 NULL FORNITURAS GILDO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.0400 1 2003 1448
2003-01-16 00:00:00.000 122 64 NULL ANTONIA D'PICO ADORNOS, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.5500 1 2003 142
2003-02-12 00:00:00.000 424 143 NULL APLISTAR, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 60.0000 2.6200 1 2003 605 2003-02-06
00:00:00.000 353 165 NULL FORNITURAS GILDO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 30.0000 3.6400 1 2003 620 2003-02-13
00:00:00.000 451 187 NULL MANUEL MEDINILLA CARRASCO
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.0400 1 2003 1448
2003-02-18 00:00:00.000 511 218 NULL ANTONIA D'PICO ADORNOS, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.5500 1 2003 142
2003-02-28 00:00:00.000 650 219 NULL APLISTAR, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.7400 1 2003 242 2003-02-17
00:00:00.000 488 284 NULL VIDAL IÑESTA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 70.0000 2.6200 1 2003 605 2003-03-10
00:00:00.000 762 313 NULL FORNITURAS GILDO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 80.0000 2.6200 1 2003 605 2003-03-18
00:00:00.000 854 381 NULL FORNITURAS GILDO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.6600 1 2003 142
2003-04-07 00:00:00.000 1069 441 NULL APLISTAR, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 30.0000 3.8000 1 2003 620 2003-04-09
00:00:00.000 1119 489 NULL MANUEL MEDINILLA CARRASCO
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 20.0000 4.9500 1 2003 242 2003-04-02
00:00:00.000 1029 515 NULL VIDAL IÑESTA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 30.0000 3.7900 1 2003 1021
2003-04-24 00:00:00.000 1275 584 NULL SUMINISTROS ART. CALZADO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 50.0000 2.6600 1 2003 142 2003-05-09
00:00:00.000 1432 593 NULL APLISTAR, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 50.0000 3.8000 1 2003 620 2003-05-05
00:00:00.000 1365 638 NULL MANUEL MEDINILLA CARRASCO
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 3.7900 1 2003 11 2003-05-23
00:00:00.000 1616 678 NULL CREACIONES ANYSA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 30.0000 2.6200 1 2003 605 2003-05-29
00:00:00.000 1714 693 NULL FORNITURAS GILDO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 3.8000 1 2003 620 2003-06-03
00:00:00.000 1716 795 NULL MANUEL MEDINILLA CARRASCO
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.2200 1 2003 1021
2003-06-12 00:00:00.000 1899 809 NULL SUMINISTROS ART. CALZADO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 50.0000 3.7900 1 2003 1021
2003-06-10 00:00:00.000 1838 809 NULL SUMINISTROS ART. CALZADO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 3.7900 1 2003 11 2003-06-19
00:00:00.000 2004 837 NULL CREACIONES ANYSA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.6300 1 2003 142
2003-07-01 00:00:00.000 2163 902 NULL APLISTAR, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 50.0000 2.6200 1 2003 605 2003-07-09
00:00:00.000 2268 924 NULL FORNITURAS GILDO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 30.0000 3.8000 1 2003 620 2003-07-29
00:00:00.000 2550 1036 NULL MANUEL MEDINILLA CARRASCO
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 20.0000 3.7900 1 2003 11 2003-08-08
00:00:00.000 2656 1068 NULL CREACIONES ANYSA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 30.0000 2.6200 1 2003 605 2003-08-29
00:00:00.000 2683 1106 NULL FORNITURAS GILDO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 3.7900 1 2003 1021
2003-09-10 00:00:00.000 2829 1196 NULL SUMINISTROS ART. CALZADO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 5.0000 2.6600 1 2003 142 2003-09-22
00:00:00.000 2981 1208 NULL APLISTAR, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 20.0000 2.6200 1 2003 605 2003-09-30
00:00:00.000 3096 1234 NULL FORNITURAS GILDO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 40.0000 4.2200 1 2003 1507
2003-09-25 00:00:00.000 3057 1239 NULL FRANCISCO ROMAN CREMADES
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.6600 1 2003 1021
2003-10-28 00:00:00.000 3426 1449 NULL SUMINISTROS ART. CALZADO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.6600 1 2003 10 2003-12-03
00:00:00.000 3865 1670 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 200.0000 2.6600 1 2003 10 2003-12-11
00:00:00.000 3963 1670 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.9500 1 2003 242 2003-12-02
00:00:00.000 3844 1675 NULL VIDAL IÑESTA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 200.0000 2.6600 1 2003 1021
2003-12-24 00:00:00.000 4102 1740 NULL SUMINISTROS ART. CALZADO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.2200 1 2003 145 2003-05-06
00:00:00.000 5225 10086 NULL ROBERTO SANZ AMOROS
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.2200 1 2003 145 2003-05-20
00:00:00.000 5247 10086 NULL ROBERTO SANZ AMOROS
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.2200 1 2003 145 2003-05-27
00:00:00.000 5260 10086 NULL ROBERTO SANZ AMOROS
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.2200 1 2003 145 2003-05-29
00:00:00.000 5268 10086 NULL ROBERTO SANZ AMOROS
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.2200 1 2003 145 2003-06-11
00:00:00.000 5283 10104 NULL ROBERTO SANZ AMOROS
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 .0000 1 2004 1769 2004-05-11
00:00:00.000 40 NULL NULL NIQUELADOS M.B., S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 40.0000 .0000 1 2004 1770 2004-02-25
00:00:00.000 18 NULL NULL ORONIK, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 .0000 1 2004 1770
2004-03-10 00:00:00.000 20 NULL NULL ORONIK, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 200.0000 .0000 1 2004 1770
2004-02-19 00:00:00.000 16 NULL NULL ORONIK, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 200.0000 .0000 1 2004 1770
2004-06-23 00:00:00.000 57 NULL NULL ORONIK, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 300.0000 1.5390 0 2004 104
2004-05-07 00:00:00.000 2525 NULL NULL F.B. COMPONENTES, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 300.0000 1.5390 0 2004 104
2004-06-01 00:00:00.000 3027 NULL NULL F.B. COMPONENTES, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 400.0000 1.5390 0 2004 104
2004-06-15 00:00:00.000 3394 NULL NULL F.B. COMPONENTES, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 500.0000 1.5390 0 2004 104
2004-02-27 00:00:00.000 1103 NULL NULL F.B. COMPONENTES, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 500.0000 1.5390 0 2004 104
2004-03-16 00:00:00.000 1488 NULL NULL F.B. COMPONENTES, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 500.0000 1.5400 0 2004 104
2004-11-26 00:00:00.000 6530 NULL NULL F.B. COMPONENTES, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 1000.0000 1.5390 0 2004 104
2004-09-14 00:00:00.000 4905 NULL NULL F.B. COMPONENTES, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 1400.0000 1.5390 0 2004 104
2004-07-01 00:00:00.000 3731 NULL NULL F.B. COMPONENTES, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 1619.0000 1.5390 0 2004 104
2004-07-27 00:00:00.000 4303 NULL NULL F.B. COMPONENTES, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 3500.0000 1.5400 0 2004 104
2004-12-09 00:00:00.000 6797 NULL NULL F.B. COMPONENTES, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 1.0000 3.9790 1 2004 11 2004-01-27
00:00:00.000 4375 1832 NULL CREACIONES ANYSA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 3.9790 1 2004 11 2004-01-29
00:00:00.000 4417 1832 NULL CREACIONES ANYSA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 20.0000 5.1970 1 2004 242 2004-01-28
00:00:00.000 4398 1886 NULL VIDAL IÑESTA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 5.1970 1 2004 242 2004-02-10
00:00:00.000 4554 1965 NULL VIDAL IÑESTA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 3.9790 1 2004 1021
2004-02-24 00:00:00.000 4738 2041 NULL SUMINISTROS ART. CALZADO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.7900 1 2004 10 2004-02-19
00:00:00.000 4691 2042 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 5.1970 1 2004 242 2004-02-23
00:00:00.000 4726 2045 NULL VIDAL IÑESTA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 5.1970 1 2004 242 2004-03-09
00:00:00.000 4920 2152 NULL VIDAL IÑESTA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.7900 1 2004 10 2004-04-01
00:00:00.000 5180 2284 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 30.0000 2.7510 1 2004 605 2004-04-27
00:00:00.000 5412 2317 NULL FORNITURAS GILDO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.7900 1 2004 10 2004-04-21
00:00:00.000 5376 2356 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.4330 1 2004 19 2004-05-13
00:00:00.000 5623 2404 NULL J. BERNAD COMPLEMENTOS, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.7900 1 2004 10 2004-05-25
00:00:00.000 5762 2516 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.4330 1 2004 19 2004-06-11
00:00:00.000 5960 2565 NULL J. BERNAD COMPLEMENTOS, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.7900 1 2004 10 2004-06-16
00:00:00.000 6019 2672 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.7900 1 2004 10 2004-06-21
00:00:00.000 6069 2672 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.7900 1 2004 10 2004-06-24
00:00:00.000 6149 2672 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.7900 1 2004 10 2004-07-07
00:00:00.000 6297 2752 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 1000.0000 2.4000 1 2004 477
2004-07-19 00:00:00.000 6404 2796 NULL GIL CARRIO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 2.7900 1 2004 10 2004-08-26
00:00:00.000 6648 2915 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 5.0000 4.8300 1 2004 19 2004-09-13
00:00:00.000 6781 2955 NULL J. BERNAD COMPLEMENTOS, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 60.0000 4.4310 1 2004 10 2004-09-14
00:00:00.000 6789 2975 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 60.0000 2.7900 1 2004 10 2004-10-07
00:00:00.000 7039 3107 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.8330 1 2004 109 2004-10-28
00:00:00.000 7196 3132 NULL ENRIQUE MARTINEZ PASTOR, S.A.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 60.0000 2.7900 1 2004 10 2004-11-10
00:00:00.000 7321 3228 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 150.0000 2.7900 1 2004 10 2004-11-03
00:00:00.000 7236 3228 NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 1000.0000 2.5000 1 2004 1803
2004-11-30 00:00:00.000 7520 3259 NULL CREACIONES PACO ESPEJO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 50.0000 4.4300 1 2004 109 2004-11-17
00:00:00.000 7384 3264 NULL ENRIQUE MARTINEZ PASTOR, S.A.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 450.0000 2.5000 1 2004 477
2004-11-30 00:00:00.000 7537 3277 NULL GIL CARRIO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 600.0000 2.5000 1 2004 477
2004-11-17 00:00:00.000 7388 3277 NULL GIL CARRIO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 60.0000 4.4300 1 2004 109 2004-12-02
00:00:00.000 7557 3351 NULL ENRIQUE MARTINEZ PASTOR, S.A.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 4.4310 1 2004 145 2004-05-05
00:00:00.000 5752 10291 NULL ROBERTO SANZ AMOROS
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 3.0500 1 2005 10 2005-04-12
00:00:00.000 1016 NULL NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 50.0000 3.0500 1 2005 10 2005-04-05
00:00:00.000 931 NULL NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 .0000 1 2005 1770
2005-03-01 00:00:00.000 140 NULL NULL ORONIK, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 100.0000 3.0500 1 2005 10 2005-04-14
00:00:00.000 1031 NULL NULL SUMINISTROS SARABIA, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 20.0000 3.0000 1 2005 605 2005-01-11
00:00:00.000 47 25 NULL FORNITURAS GILDO, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 10.0000 5.6000 1 2005 1782
2005-02-11 00:00:00.000 391 212 NULL VICENTE IÑESTA SAMPER
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. .2000 5.6000 1 2005 238 2005-02-25
00:00:00.000 553 231 NULL CLENAPAL, S.L.
1 OJETE OR3/4 C.V. DORADO DOOR3/4 C.V. 1000.0000 2.7000 1 2005 477
2005-03-30 00:00:00.000 865 391 NULL GIL CARRIO, S.L.




"Alejandro Mesa" escribió en el
mensaje news:
Correccion,

...
Una para sacar la informacion desde AlbaranesVentas.
...

La primera sentencia debe incluir todas las filas desde AlbaranesVentas.
La
segunda solo las facturas que no estan asociadas a una fila en
AlbaranesVentas y la tercera la info desde TicketsVentas que no tienen
asociada una fila en AlbaranesVentas y FacturasVentas.


AMB

"Alejandro Mesa" wrote:

Manolo,

Crea tres sentencias. Una para sacar la informacion desde
AlbaranesVentas,
para aquellos que no tengan factura o ticket asociados. Una segunda que
saca
la informacion desde FacturasVentas, pero solo aquellas facturas que no
tengan filas asociadas en AlbaranesVentas y TicketsVentas. Una tercera
para
seleccionar info desde TicketsVentas, solo aquellas filas que no tengan
asociadas una fila en AlbaranesVentas y FacturasVentas. entonces puedes
hacer
la union de las tres.


AMB

"manolo" wrote:

> Hola Jose Mariano,
>
> El caso es que de esta forma me daría datos duplicados.
>
> Cuando creo un albarán, creo un registro en la tabla Albaranes y un
> registro por artículo del albarán en la tabla detalles.
> Cuando creo una factura de este albarán, lo único que hago en la
> tabla
> detalles es ponerle el número de factura al campo idFactura.
> De la misma forma, puedo crear una factura que no proceda de un
> albarán,
> por lo cual el campo idAlbaran puede ser nulo.
> Es por esto por lo que no puedo hacer una unión. los campos
> resumidos
> que me debe devolver la consulta son:
>
> Artículo, Cliente, nº Factura, nº Albarán, nº Ticket, Fecha
> factura,
> Fecha albarán, Fecha Ticket, Cantidad, Precio.
>
> De este modo de un vistazo podría ver en que fechas, documentos y
> precio
> se vendió un artículo, haciendo sum, la cantidad que se ha vendido,
> uniendo
> esta consulta con un union a otra consulta de compras ver el stock
> actual de
> los artículos, etc...
>
> Gracias y un saludo.
>
> "Jose Mariano Alvarez" escribió en el
> mensaje
> news:
> > Sugiero si te sirve que pruebes con UNION en lugar de los LEFT JOIN.
> >
> > Select 1
> > UNION
> > Select 2
> > UNION
> > Select 3
> >
> > Saludos
> > Jose Mariano
> >
>
>
>
Respuesta Responder a este mensaje
#8 manolo
26/04/2005 - 16:35 | Informe spam
Hola!

No veas lo que se ha mejorado el tiempo de ejecución, y eso que parecía
una chorrada!!!

Muchíiisimas gracias.

"qwalgrande" escribió en el mensaje
news:%
Hola.

A modo de sugerencia, si te fijas, sólo hay un campo que necesites de la
tablas Clientes, el campo RazónSocial. Bien, crea una función que te lo
devuelva, pasándole código, que obtendrías en tu consulta del coalesce de
AlbaranesVentas.Cliente, FacturasVentas.Cliente y TicketsVentas.Cliente.
Así ya no tendrías que incluir la tabla Clientes en la consulta.
Suponiendo que el campo RazonSocial es un nvarchar(255) y el campo Codigo
un int, sería:

create function Cliente_RazonSocial(@pCodigo int) returns nvarchar(255)
begin
declare @ret nvarchar(255)

select @ret = RazonSocial from Clientes where Codigo = @pCodigo

return @ret
end

Y tu consulta quedaría:

select Articulos.Codigo as codArticulo,
...
dbo.Cliente_RazonSocial(coalesce(AlbaranesVentas.Cliente,
FacturasVentas.Cliente, TicketsVentas.Cliente) as RazonSocial

from Articulos left join Tallas on articulos.talla = tallas.Codigo left
join
colores on articulos.color = colores.codigo
inner join DetallesAlbaranesVentas on Articulos.Codigo > DetallesAlbaranesVentas.codArticulo
left join AlbaranesVentas on DetallesAlbaranesVentas.numAlbaran > AlbaranesVentas.numAlbaran and DetallesAlbaranesVentas.Ejercicio > AlbaranesVentas.Ejercicio and DetallesAlbaranesVentas.Serie > AlbaranesVentas.Serie
left join FacturasVentas on DetallesAlbaranesVentas.numFactura > FacturasVentas.numFactura and DetallesAlbaranesVentas.EjercicioFacturas > FacturasVentas.Ejercicio and DetallesAlbaranesVentas.Serie > FacturasVentas.Serie
left join TicketsVentas on DetallesAlbaranesVentas.numTicket > TicketsVentas.numTicket and DetallesAlbaranesVentas.EjercicioFacturas > TicketsVentas.Ejercicio and DetallesAlbaranesVentas.Serie > TicketsVentas.Serie

qwalgrande


"manolo" escribió en el mensaje
news:
Hola,

Tengo una consulta que se ejecuta muy lenta.
Mi idea es unir 6 tablas y este es más o menos el resumen:

Albaranes.IdAlbaran, Albaranes.idCliente
Facturas.IdFactura, Facturas.idCliente
Tickets.idTicket, Tickets.idCliente
Detalles.idAlbaran, Detalles.idFactura, Detalles.idTicket,
Detalles.idArticulo
Articulos.idArticulo
Clientes.idCliente

Pues bien, quiero hacer una vista que muestre todos los movimientos de
artículos según el detalle.
Un detalle puede formar parte de un albarán, de un albarán y una
factura, de una factura, de un ticket y una factura o de un ticket, por
lo cual hago las uniones con right join.
Para devolver el cliente, utilizo la función coalesce, que devuelve el
primer valor no nulo de una lista de valores. Pues es en esta línea donde
se relentiza mucho la consulta, tarda de 5 a 10 minutos con unos 20000
registros y si le quito la línea es casi instantánea.
La línea en cuestión es:

from ...
inner join Clientes on Clientes.idCliente = coalesce(Albaranes.idCliente,
Facturas.idCliente, Tickets.idCliente)

¿Existe otra ffunción o existe otro modo de solucionar la velocidad?

Muchas gracias, perdón por el sermón y un saludo.

P.D. para facilitar la lectura, he omitido algunas tablas, he cambiado
los nombres de las tablas y de los campos. la consulta completa es:

select Articulos.Codigo as codArticulo,
rtrim(Articulos.Descripcion + ' ' + Tallas.Descripcion + ' ' +
Colores.Descripcion) as descripcion,
Articulos.cInterno,
DetallesAlbaranesVentas.Cantidad,
DetallesAlbaranesVentas.Precio,
DetallesAlbaranesVentas.Tipo,
DetallesAlbaranesVentas.Ejercicio,
coalesce(AlbaranesVentas.Cliente, FacturasVentas.Cliente,
TicketsVentas.Cliente) as Cliente,
coalesce(AlbaranesVentas.FechaAlbaran, FacturasVentas.FechaFactura,
TicketsVentas.FechaTicket) as Fecha,
convert(nvarchar(16), AlbaranesVentas.numAlbaran) as numAlbaran,
FacturasVentas.numFactura,
TicketsVentas.NumTicket,
Clientes.RazonSocial
from Articulos left join Tallas on articulos.talla = tallas.Codigo left
join colores on articulos.color = colores.codigo
inner join DetallesAlbaranesVentas on Articulos.Codigo =
DetallesAlbaranesVentas.codArticulo
left join AlbaranesVentas on DetallesAlbaranesVentas.numAlbaran =
AlbaranesVentas.numAlbaran and DetallesAlbaranesVentas.Ejercicio =
AlbaranesVentas.Ejercicio and DetallesAlbaranesVentas.Serie =
AlbaranesVentas.Serie
left join FacturasVentas on DetallesAlbaranesVentas.numFactura =
FacturasVentas.numFactura and DetallesAlbaranesVentas.EjercicioFacturas =
FacturasVentas.Ejercicio and DetallesAlbaranesVentas.Serie =
FacturasVentas.Serie
left join TicketsVentas on DetallesAlbaranesVentas.numTicket =
TicketsVentas.numTicket and DetallesAlbaranesVentas.EjercicioFacturas =
TicketsVentas.Ejercicio and DetallesAlbaranesVentas.Serie =
TicketsVentas.Serie
inner join Clientes on Clientes.Codigo =
coalesce(AlbaranesVentas.Cliente, FacturasVentas.Cliente,
TicketsVentas.Cliente)






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida