Windows Mobile:内部联接查询不起作用

Posted

技术标签:

【中文标题】Windows Mobile:内部联接查询不起作用【英文标题】:Windows Mobile: Inner join query doesnt work 【发布时间】:2011-10-18 10:26:53 【问题描述】:

我已经从早期的 Windows 移动应用程序开发。 我有桌子:

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   
.
.

我想按状态收集,并将状态0和所有记录分开,按roomno分组

输出将是这样的:

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 server 精简版中运行良好,但是当我在 Visual Studio 2005 中运行时出现错误“解析查询时出错,[ Token line number = 1, Toker ofset = 78, in error =选择]"

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();
        
    

我应该怎么做才能修复这个错误?谢谢

【问题讨论】:

SQL Query 中的 status 是 SQL 关键字还是 SQL 表字段?也许 Visual Studio 也不知道。 【参考方案1】:

错误可能是由于查询不受支持。通过将其分解为子部分并单独运行它们来检查它 - 这可以在 Studio 中使用服务器资源管理器针对桌面上的数据库直接完成。我不知道是否支持 count(*) (IIRC 它不在早期版本中,尽管它很可能在 3.5 中)。我不确定是否支持别名。我相当肯定使用查询的结果作为输入不是。

除了错误,这是一个复杂的查询 - 太复杂了。在我看来,加入另外两个连接(也被分组)的结果会立即引发嵌入式系统的性能和内存使用的危险信号。

如果我在对客户代码的代码审查中看到这一点,我强烈建议对表进行非规范化以减少所有这些工作(您不是在具有千兆字节 RAM 的四核服务器计算机上)。也许尝试以更接近您想要的输出的方式存储数据也是一个很好的步骤。我还建议尝试将其分解为更小的工作单元,这些工作单元可以通过更少的查询处理器交互来完成(我完全不使用查询解析器)。

如果我在审查为我工作的人的代码时看到这一点,我会打他们一巴掌,因为这直接违反了“保持简单”,这是您在资源有限的环境中必须做的。

【讨论】:

SQLCE 3.5 支持语句 COUNT(*) 按照建议分解语句。您可以通过 LINQ 在运行时分组和加入。 cacke:感谢 btw cacke,这个项目的目的是为了显示这样的输出。你曾经为了简单化而做另一种方式。 mybe 使用其他解决方案来实现这个目标?

以上是关于Windows Mobile:内部联接查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将多条记录添加到数据库时,内部联接的 LINQ 查询不起作用

内部联接在 Slick 中不起作用

内部联接在使用 Spark 2.1 的 DataFrame 中不起作用

SQL 联接查询在 PowerShell 中不起作用

INNER JOIN 更新不起作用

外部联接中的内部异常