2011-10-18 2 views
0

저는 이전 Windows 모바일 앱에서 이미 개발했습니다. 나는 테이블이 :Windows Mobile : 내부 조인 쿼리가 작동하지 않습니다.

내가 출력은 다음과 같이 될 것입니다 roomno

에 의해 상태와 분리 된 상태를 0과 모든 기록, 그룹에 의해 수집 할

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 Status0 sllstatus 
DPN  1   2 
TRG  0   1 
SHW  0   1 
ROM  1   1 

내가 쿼리가 like :

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에서 잘 실행됩니다. 내가 오류를 가진 비주얼 스튜디오 2005에서 실행할 때 어 소형 판,하지만

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에서 '상태'는 SQL 키워드 또는 SQL 테이블 필드를 쿼리합니까? 아마도 Visual Studio는 그 중 하나를 알지 못합니다. – jp2code

답변

0

오류가 지원되지 않는 쿼리에 회부 될 가능성이 있습니다. 이를 하위 파트로 분할하여 개별적으로 실행하여 확인하십시오. Studio에서 서버 탐색기를 사용하여 데이터베이스의 데이터베이스와 비교하여 바로 수행 할 수 있습니다. 카운트 (*)가 지원되는지 (3.5 버전일지도 모르지만 IIRC는 이전 버전에 없었 음) 모르겠습니다. 앨리어싱이 지원되는지 확실하지 않습니다. 나는 입력으로 쿼리의 결과를 사용하여 상당히 확신 해요.

오류를 제외하고 이것은 복잡한 쿼리입니다. 너무 복잡합니다. 다른 두 개의 조인 (그룹화 된)의 결과를 결합하면 내 눈의 임베디드 시스템에서 성능과 메모리 사용량에 즉각적인 빨간색 플래그가 표시됩니다.

고객 코드에 대한 코드 리뷰에서 이것을 보았다면이 모든 작업을 줄이기 위해 테이블을 비정규화할 것을 강력히 권장합니다 (사용자가 기가 바이트 RAM을 갖춘 쿼드 코어 서버 시스템에 있지 않음) . 어쩌면 데이터를 비슷한 방식으로 저장하려고하면 출력으로도 좋을 것입니다. 나는 또한 쿼리 프로세서와의 상호 작용이 적어 질 수있는 더 작은 작업 단위로 나눌 것을 권한다. (나는 쿼리 파서를 전혀 사용하지 않는 팬이다.)

나를 위해 일하는 사람이 코드를 검토하는 동안 이것을 본다면 리소스 제한 환경에서 수행해야하는 "단순하게 유지"의 직접적인 위반 인 것처럼 나는이를 때렸습니다.

+0

SQLCE 3.5에서 COUNT (*) 문이 지원됩니다. 권장 사항대로 문을 중단하십시오. LINQ를 통해 런타임에 그룹화 및 결합 할 수 있습니다. –

+0

ctacke : 감사합니다. btw ctacke,이 프로젝트의 목적은 출력을 표시하는 것입니다. 이제까지는 다른 방법으로 간단하게 할 수 있습니다. mybe는이 목표를 걷어차는 다른 해결책을 사용하고 있습니까? – indi60

관련 문제