我正在尝试在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支持子查询。有什么我做错了吗?
答案 0 :(得分:23)
SQL CE中的限制是它不支持返回标量值的子查询。返回一个集合的子查询被解析得很好。
Grayson的答案中的连接中的子查询返回一个集合,因此它应该可以工作。有时在连接条件下无法避免标量子查询。通过使用'IN'而不是'=',可以欺骗解析器。
请参阅我对this question的回答。
答案 1 :(得分: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是要使用的正确连接类型,因为即使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 chapter about subqueries中找到了,看起来您应该尝试在子查询后删除“as numprograms”子句...也许您无法对列的命名做出任何选择在你已经编写子查询之后,在子查询之外。