2009-03-14 19 views
6

SQL Server CEデータベースでこれを実行しようとしていますが、データベースエンジンはエラーを報告し続けます。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; 

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

+0

エラーは何ですか? –

+0

こんにちは、 申し訳ありませんが、修正されました。みなさん、ありがとうございます。 Azuka – Zahymaka

答えて

5

クエリでの私の経験は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を、使用する参加の正しいタイプであります特定のCレコードのDテーブルでは、結果セットにはその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 chapter about subqueriesに興味があり、サブクエリの後に "as numprograms"句を削除してみるといいでしょう。おそらく、あなたのサブクエリの後に出てくるカラムの命名について何も選択できないようです。サブクエリを作成した後でサブクエリを作成します。

+1

ありがとうございます。最初のクエリは機能しませんでしたが、2番目のクエリは完全に機能しました。カウントが0だったインスタンスの場合はNULLを返しますが、私が取得することがわかっているデータに基づいて、私は約99.99%が0カウントになることはないと確信しています。 ありがとう、もう一度、 Azuka – Zahymaka

+0

クール、それは働いていることを知ってよ!値がnullでないことを100%確実にしたい場合は、S.numprogsを "IF(S.numprogs IS NULL、0、S.numprogs)"に置き換えるか、または "IFNULL(S .nu​​mprogs、0) " –

23

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

Graysonの回答の中のサブクエリは集合を返しますので、それはうまくいくはずです。スカラー・サブクエリは、結合条件では回避できないことがあります。 '='の代わりに 'IN'を使うと、パーサを欺くことができます。

私の答えはthis questionです。

+0

ニース、このソリューションは私のために働いた! –

関連する問題