Access - Ayuda con subconsulta y ACCESS

 
Vista:

Ayuda con subconsulta y ACCESS

Publicado por Karrask (1 intervención) el 27/02/2004 16:59:51
Hola!
Tengo un problema con una consulta algo compleja...
La he probado en SQLServer y funciona, pero el problema es para
una base de datos en MS-Access (2003). Las dos BD tienen los mismo datos, pero en SQLServer devuelve lo que espero, y en Access no devuelve nada. Ningun dato.

La consulta es:

SELECT DISTINCT A.subcuenta, 0 as Debe, 0 as Haber
FROM A, B
WHERE NOT EXISTS
(SELECT Subcuenta FROM
(SELECT DISTINCT A.subcuenta
FROM A, B
WHERE ( A.asiento = B.asiento AND A.ejercicio = B.ejercicio)
AND (A.subcuenta BETWEEN 100000000 AND 700000000)
AND (A.ejercicio = 1) AND (A.Fecha < #01/02/2000#))
AS T3
WHERE A.subcuenta = T3.subcuenta
)
AND
(A.asiento = B.asiento AND A.ejercicio = B.ejercicio)
AND (A.subcuenta BETWEEN 100000000 AND 700000000)
AND (A.Fecha BETWEEN #01/02/2000#)

El problema debe ser por usar NOT EXIST.
Lo he hecho asi, porque antes tenia la consulta usando IN
pero era muy lenta, debido al gran volumen de datos de la BD.

Aparte del problema que os comento, veis alguna forma de
SIMPLIFICAR la consulta??? No hago JOIN entre las tablas
porque para cada asiento/ejercicio de la tabla A, tengo varios
asiento/ejercicio/fila en la tabla B.

UN SALUDO y GRACIAS!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Ayuda con subconsulta y ACCESS

Publicado por Alejandro (4142 intervenciones) el 04/05/2023 21:48:22
En MS Access, es recomendable evitar el uso de subconsultas anidadas en el WHERE, como es el caso de tu consulta, ya que pueden ser muy lentas y causar problemas de rendimiento.

Una alternativa que puedes probar es usar una consulta separada para obtener los valores de Subcuenta que deseas excluir, y luego utilizar la consulta principal para obtener los resultados deseados. Por ejemplo:

Primero, crea una consulta llamada "SubcuentasExcluidas" que devuelva las Subcuentas que deseas excluir:

1
2
3
SELECT DISTINCT A.subcuenta
FROM A INNER JOIN B ON A.asiento = B.asiento AND A.ejercicio = B.ejercicio
WHERE A.subcuenta BETWEEN 100000000 AND 700000000 AND A.ejercicio = 1 AND A.Fecha < #01/02/2000#

Luego, usa esta consulta como una subconsulta en la consulta principal para excluir las Subcuentas en la cláusula WHERE:

1
2
3
4
SELECT DISTINCT A.subcuenta, 0 as Debe, 0 as Haber
FROM A INNER JOIN B ON A.asiento = B.asiento AND A.ejercicio = B.ejercicio
WHERE A.subcuenta BETWEEN 100000000 AND 700000000 AND A.Fecha BETWEEN #01/02/2000#
AND A.subcuenta NOT IN (SELECT Subcuenta FROM SubcuentasExcluidas)

En cuanto a simplificar la consulta, no veo una forma obvia de hacerlo sin información adicional sobre la estructura de tus tablas y los datos que deseas obtener. Sin embargo, al utilizar INNER JOIN en lugar de la sintaxis de join implícita que estás usando, puede ayudar a hacer la consulta más legible. Además, si hay algún campo que puedas utilizar para limitar el número de filas de la tabla B que estás consultando (por ejemplo, una fecha o un ID de asiento), podría ayudar a reducir el tiempo de ejecución de la consulta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar