2016-04-17 59 views
0

第一次張貼海報/ Oracle newb。在where子句中顯示最小值,最大值=值太多?

我試圖表現出最小和最大年齡在where子句中,到目前爲止,我可以告訴要麼最小或最大,但是當我試圖表明他們兩個返回

ORA-00913:太許多值」

這裏是我的最小/最大代碼(正常工作);

SELECT ROUND 
((SYSDATE - TO_DATE (DOB)) /365, 0) "AGE" 
FROM EMPLOYEE 
WHERE 
DOB = (SELECT MIN (DOB) FROM EMPLOYEE); 

當我把它們放在一起喜歡 -

SELECT ROUND 
((SYSDATE - TO_DATE (DOB)) /365, 0) "AGE" 
FROM EMPLOYEE 
WHERE 
DOB = (SELECT MIN (DOB), MAX (DOB) FROM EMPLOYEE); 

是我遇到問題的地方,我試着用AND分割它們,它根本沒有任何幫助。不知道我可以做什麼,任何幫助表示讚賞。

回答

0

Min(DOB)是一個單值,因此您可以在where子句中使用=。但(SELECT MIN (DOB), MAX (DOB) FROM EMPLOYEE)因此返回多個值,你必須使用IN

SELECT ROUND 
((SYSDATE - TO_DATE (DOB)) /365, 0) "AGE" 
FROM EMPLOYEE 
WHERE 
DOB IN (SELECT MIN (DOB), MAX (DOB) FROM EMPLOYEE); 
+0

這也返回了太多的值。感謝您的回覆。 – bigmouthsmithers

+1

這樣寫,子查詢返回兩列。這不僅表現出小小的SQL技能(在你教別人之前學習更多!) - 它還表明你在發佈之前沒有測試過你的查詢。讓真正的專家不經測試發佈;直到測試,然後發佈。 – mathguy

0

如果我理解正確的話,而你試圖讓所有EMPLOYEES記錄中有一個DOB值是最小值和最大值的數據庫,你可以用SELECT的數據,然後用OR來加載數據。

DECLARE 
    max_dob datetime; 
    min_dob datetime; 

SELECT MAX(DOB), MIN(DOB) INTO max_dob, min_dob 
FROM EMPLOYEES; 

SELECT ROUND 
((SYSDATE - TO_DATE (DOB)) /365, 0) "AGE" 
FROM EMPLOYEE 
WHERE DOB = min_dob 
OR DOB = max_dob; 
+0

爲什麼它需要如此複雜? – mathguy

-1

你爲什麼試圖用AND分割它們?您是否在尋找一個同時爲min和max的DOB?你的困難在於邏輯,而不是SQL!

這將工作:

SELECT ROUND ((SYSDATE - TO_DATE(DOB)) /365, 0) AS AGE 
FROM EMPLOYEE 
WHERE DOB = (SELECT MIN(DOB) FROM EMPLOYEE) OR DOB = (SELECT MAX(DOB) FROM EMPLOYEE) 

多幾個音符 - 我刪除了來自各地的AGE雙引號,他們並不需要(在一般情況下,如果你確實需要報價,你可能要考慮改爲別名),我在列別名前添加了可選單詞AS。這不是必需的,但它使查詢更具可讀性。另外,對你來說問題:DOB是已經存在的日期,還是以字符串格式存儲?如果它已經是一個日期,那麼你不需要TO_DATE(因爲TO_DATE需要一個字符串,所以你實際上可能會得到錯誤的結果,所以Oracle會首先使用某種假定的格式將你的良好DOB轉換爲字符串,然後返回到目前爲止...您無法確定轉換是否全部正確,取決於兩種轉換中使用的隱式默認日期格式)。如果DOB是基表中的字符串數據類型,那麼首先 - 它不應該,其次 - 如果是,則應該給TO_DATE一個格式參數,所以您不依賴運氣。如果您希望Oracle使用的轉換格式與用於在基表中存儲日期的格式相同,則需要運氣。

祝你好運!

+0

有趣的投票,對於原因會很好奇:答案中的任何不正確,不清楚或不必要的東西?或者其他一些不相關的原因? – mathguy

相關問題