7

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

4

2 回答 2

25

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

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

请参阅我对这个问题的回答。

于 2009-03-15T16:08:05.590 回答
6

我在查询方面的唯一经验是使用 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”子句……也许您对子查询中出现的列的命名没有任何选择在您已经编写了子查询之后。

于 2009-03-14T08:45:35.073 回答