【问题标题】:sub query returning more than one row子查询返回多于一行
【发布时间】:2010-02-02 11:24:20
【问题描述】:

我正在 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

错误是子查询返回多行。如果我使用 IN 而不是 = 则查询将永远进行(几乎在 3 分钟后它不会停止)

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

我几乎没有 10 个不同的 BuildID

我如何做到这一点?

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    只需删除您的加入,这是多余的:

    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 等于从同一个表中获取的DISTINCTbuildId,将它们分成几个组根据buildID的值,计算各组内表达式的总和。

    = 运算符在两边都需要一个标量。在SQL 中,当且仅当它返回一个包含一个字段且最多一个记录的记录集时,才将查询视为标量。

    您的子查询返回了多条记录,因此您的原始查询失败(出现了相当多的描述性错误)。

    使用IN 运算符,查询的意思是“从同一表中的buildId 列表中的任何位置找到buildId 的表中的所有记录,根据值将它们分成几组buildID 并计算每个组内表达式的总和”。

    由于buildId总是在从同一个表中取出的buildIs列表中找到,所以条件是多余的。

    【讨论】:

    • 你能用英语解释一下我的查询是什么意思吗?以及我想做什么?
    • 好的。使用 IN 运算符,查询是否进入无限循环?或者它什么时候停止?
    • 似乎您的buildID 字段没有被索引。否则,MySQL 将只使用index_subquery,这将对每个buildId 进行一次索引扫描。如果没有索引,它必须为它解析的每条记录运行不同的查询。这个循环不是无限的,它只是很长。反正这个条件是没用的。
    【解决方案2】:

    如果您希望输出包含所有 BuildIDs,则根本不需要 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
    

    免责声明:未经测试。

    【讨论】:

    • 你能用英语解释一下我的查询是什么意思吗?我应该做什么?我需要更多地了解 SQL
    猜你喜欢
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多