2012-02-10 100 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')