2011-04-01 131 views
1

我想從kullnr得到ras的值爲1,2和3的最大值。但是當我運行這個查詢時,我在所有三個上都得到NULL。這裏的代碼:爲什麼我在這個查詢中得到NULL?

SELECT MAX(k1.kullnr) , MAX(k2.kullnr) , MAX(k3.kullnr) 
FROM kull AS k1 
JOIN kull AS k2 ON k1.kullnr = k2.kullnr 
JOIN kull AS k3 ON k1.kullnr = k3.kullnr 
WHERE k1.ras =0 
AND k2.ras =1 
AND k3.ras =2 

如果我運行查詢分離彼此,他們工作正常。例如:

SELECT MAX(kullnr) FROM kull WHERE ras=0 

但是由於存在極端的內存限制,我無法運行查詢分離。我怎樣才能使單查詢版本工作?在您的單獨的查詢

+0

你有三行'.kullnr'是相同的,'.ras'有值'1'' 2'和'3'?我們能否看到一小組數據,以及您認爲應該得到的答案? – Thanatos 2011-04-01 21:42:41

回答

0

尋找

SELECT MAX(kullnr) FROM kull WHERE ras=0 

你需要

SELECT MAX(CASE WHEN ras = 0 THEN kullnr END ) , 
     MAX(CASE WHEN ras = 1 THEN kullnr END ) , 
     MAX(CASE WHEN ras = 2 THEN kullnr END ) 
FROM kull 
WHERE ras IN (0,1,2) 

要加入上kullnr所以每一行所有自加入表將具有相同的值此字段,但是,那麼你從該字段的三個表中選擇每個值的max值。如果JOIN完全返回任何行,那麼max在所有3列中將是相同的。

2

除非所有最大的kullnr字段具有相同的值,否則您將因爲您嘗試最大化的字段而加入null。我認爲這是更想你想要的:

SELECT k1.kullnr, k2.kullnr, k3.kullnr 
FROM 
(SELECT MAX(kullnr) AS kullnr FROM kull WHERE ras = 0) k1, 
(SELECT MAX(kullnr) AS kullnr FROM kull WHERE ras = 1) k2, 
(SELECT MAX(kullnr) AS kullnr FROM kull WHERE ras = 2) k3 

我真的不認爲我會這樣做,雖然,如果我可以幫助它。如果您不需要在同一行中所有的最大值,另一個查詢可能是:

SELECT ras, MAX(kullnr) 
FROM  kull 
GROUP BY ras 
HAVING ras = 0 OR ras = 1 OR ras = 2 
+0

第一句話是不正確的。這似乎意味着'MAX'被找到,然後在'JOIN'中使用該值。相反,JOIN首先限制行(大概是OP中的空集),然後計算MAX。如果有任何'kullnr'值具有所有'ras'值的匹配值,那麼(錯誤)JOIN可能仍會返回結果。 – 2011-04-01 21:57:25

+0

@Martin也許吧。無可否認,我頭腦中的SQL解析器幾乎只知道他正在嘗試做什麼不會工作,並且可能會產生NULL值,但似乎會產生一些會產生_something_的數據組合。無論如何,我希望GROUP BY的最後一個查詢更符合需求。 – Andrew 2011-04-01 22:02:23

+1

@Martin在寫下我最後的評論之前,我沒有看到你的編輯。你的解釋現在有道理,謝謝。 – Andrew 2011-04-01 22:03:29

0

從馬丁的查詢將得到你想要的結果。

至於你爲什麼得到一個null,JOIN條件可能會阻止任何三行匹配。他們實際上限制查詢行相同的kullnr存在於ras = 0,ras = 1和ras = 2

+0

或者我剛纔看到的Andrew的查詢。我個人最喜歡GROUP BY的用法,並且正在給我投票 – 2011-04-01 21:47:38

相關問題