contar/seleccionar consulta en MS Sql Server 2005

Tengo una tabla heredada que contiene registros "maestros" y registros de detalles asociados. Los registros de detalle se identifican mediante una adición a la clave maestra de "-nnn". Necesito encontrar registros maestros que no tengan registros de detalles, probé varias variaciones y finalmente los dividí en elementos más simples.

Esto funciona:

select (select count(*) from dbo.client as cl2 
    where cl2.acct_no like (cl1.acct_no + '-%')) as countx, acct_no 
from dbo.client as cl1

y muestra los resultados esperados de cero o distintos de cero, según la cantidad de registros de detalle que haya.

Sin embargo, cuando trato de usar los resultados del conteo para seleccionar solo los registros con cero registros de detalle, así:

select (select count(*) from dbo.client as cl2 
    where cl2.acct_no like (cl1.acct_no + '-%')) as countx, acct_no 
from dbo.client as cl1 
where countx = 0

Recibo un error: "Nombre de columna no válido 'countx'"

¿Que me estoy perdiendo aqui?

preguntado el 22 de mayo de 12 a las 15:05

no puede usar el alias de columna en la cláusula where. Ese es el error. -

2 Respuestas

CountX no es una columna con nombre.

Puede que esta no sea la forma más óptima, pero envolver toda la consulta podría funcionar.

SELECT CountX, Acct_No
FROM
(
    select (select count(*) from dbo.client as cl2 
        where cl2.acct_no like (cl1.acct_no + '-%')) as countx, acct_no 
    from dbo.client as cli
) As InnerQuery
where countx = 0

Editar

Mirando esto, puede lograrse mejor usando un Join, en lugar de ese Select anidado.

SELECT     cl1.acct_no, Count(*)
FROM       dbo.client cl1 --the master key numbers
INNER JOIN dbo.client cl2 --the sub-keys
           ON cl1.acct_no NOT LIKE '%-%' --No dashes in the MasterKey
           AND cl1.acct_no LIKE (cl2.acct_no + '-%')
GROUP BY   cl1.acct_no

contestado el 22 de mayo de 12 a las 15:05

Hmmm... Entonces, ¿puedo usar nombres de columna pero no alias de columna en una cláusula where? Su consulta funcionó una vez que cambié 'cli' a 'cl1' en el segundo 'from'... gracias; eso me ayuda a comenzar con mi consulta real. - JESii

Intenta usar in para conseguir lo que quieres

 select Acct_No from dbo.client where Acct_No not in 
  (
    select acct_no from dbo.client where acct_no like acct_no + '-%'
  )

contestado el 22 de mayo de 12 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.