当前位置:  开发笔记 > 后端 > 正文

SQL Server Compact Edition中的子查询

如何解决《SQLServerCompactEdition中的子查询》经验,为你挑选了2个好方法。

我试图在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支持子查询.有什么我做错了吗?



1> cdonner..:

SQL CE的限制是它不支持返回标量值的子查询.返回一个集合的子查询被解析得很好.

Grayson的答案中的连接中的子查询返回一个集合,因此它应该可以工作.有时在连接条件下无法避免标量子查询.通过使用'IN'而不是'=',可以欺骗解析器.

看看我对这个问题的回答.



2> David Grayso..:

我在查询中的唯一经验是使用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"子句...也许您对从子查询中出来的列的命名没有任何选择在你已经编写了子查询之后.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有