子查询返回多行

时间:2010-02-02 11:24:21

标签: sql mysql

我在MYSQL中尝试这样的查询

select 
Sum(case when WindowsXP = "PASS" then 1 else 0 end) as PASS ,
Sum(case when WindowsVista = "FAIL" then 1 else 0 end) as FAIL 

from OS_Table where BuildID = (select distinct BuildID from OS_Table)
group by BuildID

错误是Subquery返回多行。如果我使用IN代替=,那么查询将永远进行(几乎在3分钟后它不会停止)

基本上我想要实现的是每个不同的BuildID,当WindowsXP =“PASS”和WindowsVista =“FAIL”时,给我计数通过,失败

我几乎没有10个不同的BuildID

我如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

只需删除你的联接,这是多余的:

SELECT  buildid,
        SUM(CASE WHEN WindowsXP = 'PASS' THEN 1 ELSE 0 END) as PASS ,
        SUM(CASE WHEN WindowsVista = 'FAIL' THEN 1 ELSE 0 END) as FAIL 
FROM    OS_Table
GROUP BY
        buildId

这个条件

WHERE BuildID IN (SELECT DISTINCT BuildID FROM OS_Table)

适用于表格中的任何非空buildid

<强>更新

您的原始查询(使用=运算符)意味着:“从buildId等于DISTINCT的{​​{1}}值的表格中取出所有记录同一个表,根据buildId的值将它们分成几组,并计算每个组中表达式的总和“。

buildID运算符需要双方标量。在=中,当且仅当它返回一个字段和最多一个记录的记录集时,查询才被视为标量。

您的子查询返回的记录多了一条记录,因此您的原始查询失败(有很多描述性错误)。

使用SQL运算符,查询意味着“从同一个表格中IN列表中找到buildId的表中的所有记录,将它们拆分为根据{{​​1}}的值计算几个组,并计算每个组中表达式的总和“。

由于buildId总是在同一个表中的buildID列表中找到,因此条件是多余的。

答案 1 :(得分:1)

如果您希望输出包含所有BuildID,则根本不需要WHERE

SELECT
    BuildID
    , SUM(CASE WHEN WindowsXP = "PASS" THEN 1 ELSE 0 END) AS PASS
    , SUM(CASE WHEN WindowsVista = "FAIL" THEN 1 ELSE 0 END) AS FAIL
FROM
    OS_Table
GROUP BY
    BuildID

免责声明:未经测试。