2012-02-10 84 views
2

以下查詢的要點是返回人員列表以及他們是否不滿意。但是,如果我不知道他們是否快樂,我想列出他們的名字和他們不快樂的「快樂」。這一點很複雜,因爲我對定義不滿意的東西有一些額外的要求。Oracle SQL - 在「語句中」左連接「

我寫這樣的查詢...

Select name.firstName, 
    CASE 
     WHEN Mood.mood is not null 
     THEN 'Unhappy' 
     ELSE 'Happy' 
    END Unhappy 
From name 
    Mood 
WHERE mood.firstName(+) = name.firstName 
AND mood.type  IN ('Hungry','Tired','Fatigued','Bored',null) 
AND mood.value(+) > 5; 

所以我想從表名返回的每一個名字,並任「開心」或「不快樂」的值,即使這些名字可能會也可能不會在情緒表中。當我運行它時,我沒有行。我想這可能涉及我的mood.type行,因爲我不能在「in」語句中使用左連接。

+0

你試評的mood.type條件,看看你得到任何行?只是爲了確保其餘的條件是正確的。 – 2012-02-10 21:43:27

+0

好想法。如果這不起作用,我會檢查下一個。 – Jeremy 2012-02-10 21:47:21

回答

9

我覺得你有幾個問題:

  1. 你有一個僞分號您的WHERE子句。
  2. CASE表達式在錯誤的地方。
  3. 您不應在IN表達式中使用NULL。

您可以刪除分號,並改變你在表達這個代替:

AND (mood.type IN ('Hungry','Tired','Fatigued','Bored') OR mood.type IS NULL) 

另外,我強烈建議你不要使用過時的聯接語法。使用JOIN關鍵字可能是一個好主意,因爲它使這種查詢變得更容易。

SELECT 
    name.firstName, 
    CASE 
     WHEN Mood.mood IS NOT NULL 
     THEN 'Unhappy' 
     ELSE 'Happy' 
    END Unhappy 
FROM name 
LEFT JOIN Mood ON 
    mood.firstName = name.firstName AND 
    mood.type IN ('Hungry','Tired','Fatigued','Bored') AND 
    mood.value > 5 
+0

立即運行查詢以查看這是否有效。但至於其他snytax,geez,這太棒了!你可以分組所有的左連接的東西。我對語法有點困惑。如果我寫了,例如,RIGHT JOIN Mood(剩下的那些東西)呢? – Jeremy 2012-02-10 21:47:07

+1

@Mark:'CASE'似乎也放錯了位置。 – 2012-02-10 21:47:29

+0

@Mark你絕對是對的。在我的實際查詢中,我將它放在正確的位置(即select語句)。我會在我的問題中移動它。 – Jeremy 2012-02-10 21:50:14

0

我會做這樣的:

select n.firstname, 
    nvl(m.mood, 'Happy') mood 
from 
    name n 
    left outer join mood m 
     on n.firstname = m.firstname 
where 
    nvl(m.type,'Hungry') in ('Hungry', 'Tired', 'Fatigued', 'Bored')