2011-10-18 16 views
0

私はすでに以前のWindowsモバイルアプリケーションから開発しています。 私はテーブルを持っている:Windows Mobile:内部結合クエリdoesnt work

assetNo nvarchar(20) 
roomno nvarchan(8) 
status ncarchar(4) 

Asset no  RoomNo  Status 
001   DPN   0   
002   TRG   4   
003   SHW   1   
004   ROOM   1   
005   DPN   1 
. 
. 

私は、出力は次のようになりますroomno

によってステータスと独立した状態0とすべてのレコード、グループによって収集したい:私は、クエリを持って

RoomNo Status0 sllstatus 
DPN  1   2 
TRG  0   1 
SHW  0   1 
ROM  1   1 

このように:

SELECT a.RoomNo , a.Scanmanual AS ScanManual, b.allscan AS AllScan 
FROM 
    (SELECT roomno, count(*) AS scanmanual 
    FROM assets 
    WHERE status = 0 
    GROUP BY roomno) AS a 
INNER JOIN 
    (SELECT roomno, count(*) AS allscan 
    FROM assets 
    GROUP BY roomno) AS b ON (a.roomno=b.roomno) 

このクエリはsql servでうまく動作しています私は、エラーを持つのVisual Studio 2005で実行すると、ERコンパクト版が、

private void Summary_Load(object sender, EventArgs e) 
    { 
     Cursor.Current = Cursors.WaitCursor; 
     string sql ="SELECT a.RoomNo , a.Scanmanual AS ScanManual, b.allscan AS  AllScan from (select roomno, count(*) AS scanmanual from assets WHERE status = 0 group by roomno) AS a inner join (select roomno, count(*) AS allscan FROM assets group by roomno) as b on(a.roomno=b.roomno)" 


     SqlCeDataAdapter da = new SqlCeDataAdapter(); 
     try 
     { 
      DataSet ds = new DataSet(); 
      da.SelectCommand = new SqlCeCommand(sql, dbConn); 
      da.Fill(ds, "Assets"); 

      dataGrid.DataSource = ds.Tables["Assets"]; 
     } 
     catch (SqlCeException ex) 
     { 
      MessageBox.Show(ex.Message, 
       "DB Operation SDF", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, 
       MessageBoxDefaultButton.Button1); 
     } 
     finally 
     { 
      Cursor.Current = Cursors.Default; 
      da.SelectCommand.Dispose(); 
      da.Dispose(); 
     } 
    } 

"クエリを解析エラー、があった[トークンの行番号= 1は、Tokerは選択=エラーで、= 78をofset]"このエラーを修正するにはどうすればよいですか?ありがとう

+0

SQLで 'status'はSQLキーワードまたはSQLテーブルフィールドをクエリしていますか?おそらく、Visual Studioはどちらも知らないでしょう。 – jp2code

答えて

0

このエラーは、サポートされていないクエリに発生する可能性があります。これをサブパーツに分割して個別に実行することでチェックしてください。これは、Studioのサーバーエクスプローラーを使用してデスクトップ上のデータベースに対して行うことができます。 count(*)がサポートされているかどうかはわかりません(IIRCは以前のバージョンではありませんでしたが、3.5でも可能です)。エイリアシングがサポートされているかどうかはわかりません。私は、入力としてクエリの結果を使用することはかなり確信しています。

エラーを除いて、これは複雑なクエリです。複雑すぎます。他の2つのジョイン(グループ化されている)の結果を結合すると、目に見えている組み込みシステムのパフォーマンスとメモリ使用のための即座の赤旗がスローされます。

私はこれを顧客のコードのコードレビューで見た場合、テーブルを非正規化してすべての作業を減らすことを強くお勧めします(これは、ギガバイトのRAMを搭載したクアッドコアサーバーマシンではありません) 。たぶん、あなたが出力として欲しいものに似ているような方法でデータを格納しようとすると、良いステップになります。私は、クエリプロセッサのやり取りが少なくて済むような小さな作業単位に分解しようと勧めています(私はクエリパーサーをまったく使用しないというファンです)。

私のために働いてくれた人がコードを見直しているのを見たら、リソースが限られている環境でやらなければならないことは「単純にする」という直接の違反です。

+0

ステートメントCOUNT(*)は、SQLCE 3.5 でサポートされています。ランタイムでLINQを使用してグループ化および結合することができます。 –

+0

ctacke: ありがとうbtw ctacke、このプロジェクトの目的は、そのような出力を表示するためです。これまでのやり方では、簡単にもう一方のやり方をしています。 mybeはこの目標をキックするために他のソリューションを使用していますか? – indi60