2009-03-14 7 views
6

J'essaie de le faire dans une base de données SQL Server CE, mais le moteur de base de données continue de signaler les erreurs.Sous-requête dans 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; 

J'ai été informé que SQL Server CE prend en charge les sous-requêtes. Y a-t-il quelque chose que je fais de mal?

+0

Quelle est l'erreur? –

+0

Bonjour, Désolé, cet article a été corrigé. Merci tout de même, Azuka – Zahymaka

Répondre

5

Mes seules expériences dans les requêtes sont avec MySQL, mais j'espère que c'est assez similaire.

Votre requête me semble étrange car votre sous-requête est dans la clause SELECT. Je n'ai jamais vu ça auparavant ... mais apparemment, il est supporté par MySQL. Habituellement, la sous-requête vient après un FROM ou LEFT JOIN ou JOIN.

Votre exemple est assez simple que vous pourriez le mettre en œuvre avec 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 

Dans ce cas, LEFT JOIN est le bon type de jointure à utiliser, car même s'il n'y a pas d'enregistrement correspondant dans la D table pour un enregistrement C particulier, votre ensemble de résultats contiendra toujours cet enregistrement C et numprogs sera juste zéro, comme vous vous y attendez.

Si vous voulez vraiment utiliser une sous-requête, essayez ceci:

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 

Je suggère de simplifier votre requête pour obtenir qu'il soit le plus simple possible requête qui devrait fonctionner, mais ne fonctionne pas. Puis dites-nous le message d'erreur spécifique que votre moteur de base de données renvoie. Edit: J'ai lu dans le MySQL chapter about subqueries et il semble que vous devriez essayer de supprimer la clause "as numprograms" après votre sous-requête ... peut-être que vous n'avez pas le choix de nommer la colonne qui sort de la sous-requête après avoir composé la sous-requête.

+1

Merci l'homme. La première requête n'a pas fonctionné, mais la seconde a fait - parfaitement. Il renvoie NULL pour les instances où le compte était 0, mais sur la base des données que je sais que je vais recevoir, je suis environ 99,99% sûr qu'il n'y aura jamais un nombre de 0. Merci encore, Azuka – Zahymaka

+0

Cool, c'est bon de savoir que ça a marché! Si vous voulez être sûr à 100% que la valeur n'est pas nulle, vous pouvez remplacer S.numprogs par "IF (S.numprogs IS NULL, 0, S.numprogs)", ou utiliser la notation abrégée "IFNULL (S .numprogs, 0) " –

23

La limitation dans SQL CE est qu'il ne prend pas en charge les sous-requêtes qui renvoient une valeur scalaire. Les sous-requêtes qui retournent un ensemble sont analysées correctement.

La sous-requête dans la jointure dans la réponse de Grayson renvoie un ensemble, donc cela devrait fonctionner. Parfois, une sous-requête scalaire ne peut pas être évitée dans une condition de jointure. En utilisant 'IN' au lieu de '=', l'analyseur peut être trompé.

Voir ma réponse à this question.

+0

Nice, cette solution a fonctionné pour moi! –

Questions connexes