2010-02-02 242 views
2
多行

我想這樣的查詢在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,給我PASS的計數,失敗時的WindowsXP = 「PASS」 和WindowsVista的= 「FAIL」

我幾乎10個不同BuildID的

如何實現這一目標?

回答

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等於的buildIdDISTINCT值從同一個表採取的表,他們分成幾根據buildID的值分組,並計算每個組內表達式的總和「。

=運算符需要雙方都有一個標量。在SQL中,當且僅當它返回一個字段和至多一條記錄的記錄集時,纔將查詢視爲標量。

您的子查詢返回了更多的一條記錄,所以您的原始查詢失敗(帶有相當多的描述性錯誤)。

隨着IN操作,查詢的意思是「從桌上拿起其中buildId是在buildId「同一個表中取是清單的任何地方發現的所有記錄,將它們分成幾組根據buildID和計算值各組內表達的總和「。

由於buildId總是在buildIs的列表中找到,所以從同一張表中可以看出,條件是多餘的。

+0

能否請你用英文解釋我的查詢意味着什麼?我想要做什麼? – JPro 2010-02-02 11:48:53

+0

好的。使用IN運算符,是查詢進入無限循環?或者什麼時候它完全停止? – JPro 2010-02-02 15:13:09

+0

似乎你的'buildID'字段沒有編入索引。否則,'MySQL'只會使用'index_subquery',這會對每個'buildId'進行一次索引掃描。沒有索引,它必須爲它解析的每條記錄運行獨特的查詢。這個循環並不是無窮無盡的,它只是很長。無論如何,這種情況根本沒用。 – Quassnoi 2010-02-02 15:19:59

1

如果你希望你的輸出包括所有BuildID S,你不需要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 

免責聲明:未經測試。

+0

你能用英文解釋我的問題嗎?我想要做什麼?我需要更多地理解SQL – JPro 2010-02-02 11:52:30