2009-03-14 27 views
6

Estoy tratando de hacer esto en una base de datos de SQL Server CE, pero el motor de la base de datos sigue informando errores.Subconsulta en SQL Server Compact Edition

SELECT C.guid, C.name, C.updated, 
     C.hddsize, C.hddavailable, C.hddfree, 
     C.ramsize, C.profiles, C.cpu, 
     (SELECT COUNT(D.id) AS numprogs 
      FROM ComputerData AS D 
      WHERE D.computer_id = C.id) AS numprograms 
FROM Computers AS C; 

Me han dicho que SQL Server CE admite subconsultas. ¿Hay algo que estoy haciendo mal?

+0

¿Cuál es el error? –

+0

Hola, Disculpe, se ha corregido. Gracias de todos modos, Azuka – Zahymaka

Respuesta

5

Mis únicas experiencias en consultas son con MySQL, pero espero que sea lo suficientemente similar.

Su consulta me parece extraña porque su subconsulta se encuentra en la cláusula SELECT. Nunca había visto eso antes ... pero aparentemente es compatible con MySQL. Usualmente la subconsulta viene después de un FROM o LEFT JOIN o JOIN.

Su ejemplo es bastante simple que se puede aplicar con un LEFT JOIN:

SELECT C.guid, ..., COUNT(distinct D.id) as numprogs 
FROM Computers AS C 
LEFT JOIN ComputerData as D ON D.computer_id = C.id 

En este caso, LEFT JOIN es el tipo correcto de unirse a usar porque incluso si no hay ningún registro coincidente en la Tabla D para un registro C particular, su conjunto de resultados aún contendrá ese registro C y numprogs simplemente será cero, como era de esperar.

Si realmente desea utilizar una subconsulta, intente esto:

SELECT C.guid, ..., S.numprogs 
FROM Computers AS C 
LEFT JOIN 
(SELECT computer_id, COUNT(*) as numprogs 
FROM ComputerData GROUP BY computer_id) AS S 
ON C.id=S.computer_id 

Sugiero simplificar su consulta para obtener que sea la consulta más sencilla posible que debería funcionar, pero no funciona. Luego cuéntanos el mensaje de error específico que devuelve tu motor de base de datos.

Edit: Me gustó el MySQL chapter about subqueries y parece que deberías intentar eliminar la cláusula "como numprogramas" después de tu subconsulta ... quizás no tengas elección sobre el nombre de la columna que sale del subconsulta después de que ya haya compuesto la subconsulta.

+1

Gracias hombre. La primera consulta no funcionó, pero la segunda sí, perfectamente. Devuelve NULL para las instancias en las que el recuento fue 0, pero según los datos que sé obtendré, tengo un 99.99% de certeza de que nunca habrá un recuento de 0. Gracias de nuevo, Azuka – Zahymaka

+0

Genial, ¡es bueno saber que funcionó! Si quiere estar 100% seguro de que el valor no es nulo, puede reemplazar S.nuperrogs con "IF (S.numprogs IS NULL, 0, S.numprogs)", o use la notación abreviada que es "IFNULL (S .numprogs, 0) " –

23

La limitación en SQL CE es que no admite subconsultas que devuelven un valor escalar. Las sub consultas que devuelven un conjunto se analizan bien.

La subconsulta en la unión en la respuesta de Grayson devuelve un conjunto, por lo que debería funcionar. A veces, una subconsulta escalar no se puede evitar en una condición de unión. Al usar 'IN' en lugar de '=', el analizador puede ser engañado.

Ver mi respuesta al this question.

+0

¡Agradable, esta solución funcionó para mí! –

Cuestiones relacionadas