【问题标题】:Subquery in SQL Server Compact EditionSQL Server Compact Edition 中的子查询
【发布时间】:2009-03-14 08:26:17
【问题描述】:

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

【问题讨论】:

  • 您好,抱歉,已修复。还是谢谢你,阿祖卡

标签: sql sql-server-ce


【解决方案1】:

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

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

查看我对this question的回复。

【讨论】:

    【解决方案2】:

    我唯一的查询经验是使用 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”子句...也许您对来自的列的命名没有任何选择在你已经组成子查询之后的子查询。

    【讨论】:

    • 谢谢哥们。第一个查询不起作用,但第二个查询却——完美。对于计数为 0 的实例,它返回 NULL,但根据我知道我将获得的数据,我有 99.99% 的把握永远不会有 0 计数。再次感谢阿祖卡
    • 酷,很高兴知道它有效!如果您想 100% 确定该值不为空,可以将 S.numprogs 替换为“IF(S.numprogs IS NULL, 0, S.numprogs)”,或使用“IFNULL(S .nu​​mprogs, 0)"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多