7

SQL Server CE データベースでこれを実行しようとしていますが、データベース エンジンがエラーを報告し続けます。

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;

SQL Server CE はサブクエリをサポートしていると聞いています。私が間違っていることはありますか?

4

2 に答える 2

25

SQL CE の制限は、スカラー値を返すサブクエリをサポートしていないことです。セットを返すサブクエリは適切に解析されます。

グレイソンの回答の結合のサブクエリはセットを返すため、機能するはずです。結合条件でスカラー サブクエリを回避できない場合があります。「=」の代わりに「IN」を使用すると、パーサーをだますことができます。

この質問に対する私の回答を参照してください。

于 2009-03-15T16:08:05.590 に答える
6

クエリでの私の唯一の経験は MySQL ですが、うまくいけば、それは十分に似ています。

サブクエリが SELECT 句にあるため、クエリが奇妙に見えます。私はこれまで見たことがありません...しかし、どうやらMySQLでサポートされているようです。通常、サブクエリは FROM または LEFT JOIN または JOIN の後に来ます。

あなたの例は、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

この場合、LEFT JOIN は使用する適切なタイプの結合です。D テーブルに特定の C レコードに一致するレコードがなくても、結果セットにはその C レコードが含まれ、numprogs はゼロになるためです。期待するでしょう。

本当にサブクエリを使用したい場合は、これを試してください:

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

クエリを単純化して、機能するはずの最も単純なクエリにすることをお勧めしますが、機能しません。次に、データベース エンジンが返す具体的なエラー メッセージをお知らせください。

編集:サブクエリに関するMySQLの章を調べましたが、サブクエリの後に「as numprograms」句を削除してみる必要があるようです...サブクエリから出てくる列の命名について選択肢がないかもしれませんサブクエリを作成した後。

于 2009-03-14T08:45:35.073 に答える