2009-03-14 16 views
6

Ich versuche, dies in einer SQL Server CE-Datenbank zu tun, aber das Datenbankmodul meldet weiterhin Fehler.Unterabfrage in 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; 

Mir wurde gesagt, SQL Server CE unterstützt Unterabfragen. Gibt es etwas, was ich falsch mache?

+0

Was ist der Fehler? –

+0

Hallo, Sorry, es wurde behoben. Danke trotzdem, Azuka – Zahymaka

Antwort

5

Meine einzigen Erfahrungen in Abfragen sind mit MySQL, aber hoffentlich ist es ähnlich genug.

Ihre Abfrage sieht für mich seltsam aus, weil Ihre Unterabfrage in der SELECT-Klausel ist. Ich habe das nie zuvor gesehen ... aber anscheinend wird es in MySQL unterstützt. Normalerweise kommt die Unterabfrage nach einem FROM oder LINKEN JOIN oder JOIN.

Ihr Beispiel einfach genug ist, dass man es mit einem LEFT implementieren könnte 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 

In diesem Fall LEFT JOIN ist die richtige Art von schließen, weil zu verwenden, auch wenn es keinen passenden Datensatz in der ist D-Tabelle für einen bestimmten C-Datensatz, Ihre Ergebnismenge enthält immer noch diesen C-Datensatz und die Nummernprotokolle werden wie erwartet nur Null sein.

Wenn Sie wirklich eine Unterabfrage verwenden möchten, versuchen Sie dies:

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 

ich Ihre Anfrage empfehlen vereinfacht, um es möglichst einfache Abfrage zu erhalten, die funktionieren sollte, aber nicht funktioniert. Dann teilen Sie uns die spezifische Fehlermeldung mit, die Ihr Datenbankmodul zurückgibt.

Bearbeiten: Ich looked in der MySQL chapter about subqueries und es scheint, als ob Sie versuchen sollten, entfernen Sie die "as numprograms" -Klausel nach Ihrer Unterabfrage ... vielleicht haben Sie keine Wahl über die Benennung der Spalte, die aus der Unterabfrage, nachdem Sie die Unterabfrage bereits verfasst haben.

+1

Danke Mann. Die erste Abfrage hat nicht funktioniert, aber die zweite - perfekt. Es gibt NULL für Instanzen zurück, in denen die Zählung 0 war, aber basierend auf den Daten, die ich kenne, werde ich ungefähr 99,99% sicher sein, dass es nie eine Zählung von 0 geben wird. Nochmals vielen Dank, Azuka – Zahymaka

+0

Cool, das ist gut zu wissen, dass es funktioniert hat! Wenn Sie 100% sicher sein wollen, dass der Wert nicht null ist, können Sie S.numprogs durch "IF (S.numprogs IS NULL, 0, S.numprogs)" ersetzen, oder verwenden Sie die Kurzschreibweise "IFNULL (S .numprogs, 0) " –

23

Die Einschränkung in SQL CE ist, dass es keine Unterabfragen unterstützt, die einen skalaren Wert zurückgeben. Unterabfragen, die einen Satz zurückgeben, werden analysiert.

Die Unterabfrage in der Grayson-Antwort gibt eine Menge zurück, also sollte es funktionieren. Manchmal kann eine skalare Unterabfrage in einer Join-Bedingung nicht vermieden werden. Mit 'IN' anstelle von '=' kann der Parser ausgetrickst werden.

Siehe meine Antwort auf this question.

+0

Schön, diese Lösung hat bei mir funktioniert! –

Verwandte Themen