Bien, ahora solo te queda responder las otras dos cunsultas que te he hecho:
- Qué indices PKs y FKs tienen estas tablas?
Puede ser que no tengas indices correctos para cuen01 o fact01
- Qué es eso de la comparación en el From?
Prueba este select, a ver cómo te va:
Código SQL
[-]SELECT DISTINCT
inve01.clv_art, inve01.descr, inve01.lin_prod,
fa0ty1.tip_doc, fa0ty1.cve_doc, fa0ty1.cant,
fa0ty1.tip_sig, fa0ty1.doc_sig, fa0ty1.tip_ant,
fa0ty1.doc_ant, fact01.fecha_doc, fact01.status,
((fact01.can_tot-fact01.des_tot)+fact01.imp_tot4) as totfac,
clie01.cclie, clie01.nombre, cuen01.no_factura,
cuen01.tipo_mov, cuen01.importe, cuen01.docto,
conc01.num_cpto, conc01.tipo
FROM
conc01
join cuen01
on conc01.num_cpto=cuen01.tipo_mov
join fact01
ON cuen01.no_factura=fact01.cve_doc OR
TRIM(cuen01.docto)=TRIM(fact01.cve_doc)
join clie01
ON clie01.cclie=fact01.cve_clpv
join fa0ty1
ON fa0ty1.cve_doc=fact01.cve_doc AND
fa0ty1.tip_doc=fact01.tip_doc
join inve01
ON fa0ty1.cve_art=inve01.clv_art
WHERE
inve01.clv_art Between '1000' AND '9000' AND
clie01.cclie Between '1' and '5000' AND
fact01.fecha_doc Between '01/01/2007'and '12/31/2007'
AND inve01.lin_prod LIKE '%'
AND fa0ty1.tip_doc <> 'P' and fa0ty1.tip_doc <> 'C'
AND fa0ty1.tip_doc <> 'R' and fact01.status <> 'C'
ORDER BY inve01.clv_art, clie01.cclie, fact01.fecha_doc, fa0ty1.tip_doc
que debería ser igual a tu select
Código SQL
[-]SELECT DISTINCT
inve01.clv_art, inve01.descr, inve01.lin_prod,
fa0ty1.tip_doc, fa0ty1.cve_doc, fa0ty1.cant,
fa0ty1.tip_sig, fa0ty1.doc_sig, fa0ty1.tip_ant,
fa0ty1.doc_ant, fact01.fecha_doc, fact01.status,
((fact01.can_tot-fact01.des_tot)+fact01.imp_tot4) as totfac,
clie01.cclie, clie01.nombre, cuen01.no_factura,
cuen01.tipo_mov, cuen01.importe, cuen01.docto,
conc01.num_cpto, conc01.tipo
FROM
conc01 INNER JOIN(cuen01 INNER JOIN(clie01 INNER JOIN (fact01 INNER JOIN (fa0ty1 INNER JOIN inve01
ON fa0ty1.cve_art=inve01.clv_art)
ON fa0ty1.cve_doc=fact01.cve_doc AND
fa0ty1.tip_doc=fact01.tip_doc)
ON clie01.cclie=fact01.cve_clpv)
ON cuen01.no_factura=fact01.cve_doc OR
TRIM(cuen01.docto)=TRIM(fact01.cve_doc))
ON conc01.num_cpto=cuen01.tipo_mov
WHERE
inve01.clv_art Between '1000' AND '9000' AND
clie01.cclie Between '1' and '5000' AND
fact01.fecha_doc Between '01/01/2007'and '12/31/2007'
AND inve01.lin_prod LIKE '%'
AND fa0ty1.tip_doc <> 'P' and fa0ty1.tip_doc <> 'C'
AND fa0ty1.tip_doc <> 'R' and fact01.status <> 'C'
ORDER BY inve01.clv_art, clie01.cclie, fact01.fecha_doc, fa0ty1.tip_doc
- Tampoco veo como unes cuen01 con clie01. Esto puede hacer que hagas más lecturas de las necesarias...
- Prueba a usar RTRIM (). Esta función quita los espacios de la derecha y quizás sea mejor para hacer comparaciones. (podrá utilizar índices sobre los campos)
- Si estas cosas no funcionan, prueba a crear campos nuevos trim_docto y trim_cve_doc calculándolos en un trigger.