es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Filtrar resultados utilizando SQL Where Exists()

Estoy usando un software que sólo me permite ingresar la parte del WHERE de una declaración SQL.

Así que puedo usar la declaración EXISTS () en la cláusula where…

sin embargo,

esta consulta…

SELECT DISTINCT Left([PR].[WBS1],5)&"-000" AS WBS1
FROM PR
GROUP BY Left([PR].[WBS1],5), Right([PR].[WBS1],3), PR.Status
HAVING ((Right(PR.WBS1,3)<>'000') And ((PR.Status)='A') And (Count(PR.Org))>1)

… devuelve 78 registros.

sin embargo,

prácticamente la misma consulta con WHERE EXISTS…

SELECT PR.WBS1 FROM PR WHERE EXISTS (

SELECT DISTINCT Left([PR].[WBS1],5)&"-000" AS WBS1
FROM PR
GROUP BY Left([PR].[WBS1],5), Right([PR].[WBS1],3), PR.Status
HAVING ((Right(PR.WBS1,3)<>'000') And ((PR.Status)='A') And (Count(PR.Org))>1)

)

… devuelve todos los registros (31.114).

Y realmente no entiendo por qué.

¿Qué estoy haciendo mal? ¿Alguien puede explicármelo, por favor?

edición: ¿Qué puedo poner aquí para que devuelva los mismos 78 registros?:

SELECT * FROM PR WHERE (

?

)

El software contable que estoy usando sólo me permite editar la parte del “where”.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual la segunda consulta con la cláusula WHERE EXISTS devuelve más registros es porque no está correlacionada con la consulta externa, lo que significa que no está comprobando la existencia de registros en la misma tabla (PR). En su lugar, la subconsulta devuelve todos los valores WBS1 distintos que cumplen las condiciones en las cláusulas GROUP BY y HAVING.

    Para obtener los mismos 78 registros en la cláusula WHERE, puedes modificar la subconsulta para que solo devuelva los valores relevantes de WBS1 y luego usar el operador IN en la cláusula WHERE para comprobar si el valor WBS1 de cada registro en la tabla PR está en ese conjunto de resultados de subconsulta. Aquí tienes un ejemplo:

    SELECT * FROM PR
    WHERE PR.WBS1 IN (
      SELECT DISTINCT LEFT(PR.WBS1, 5) &"-000" AS WBS1
      FROM PR
      WHERE RIGHT(PR.WBS1, 3) <> '000' AND PR.Status = 'A'
      GROUP BY LEFT(PR.WBS1, 5)
      HAVING COUNT(PR.Org) > 1
    )
    

    Esto debería devolver los mismos 78 registros que la consulta original.

Comments are closed.