Oracle SQL - 在“in”语句中左连接

时间:2012-02-10 21:38:30

标签: sql oracle

以下查询的要点是返回一个人员列表以及他们是否不满意。但是,如果我不知道他们是否幸福,我想列出他们的名字和他们不高兴的“快乐”。由于我对定义不满意的内容有一些额外的要求,这很复杂。

我正在写这样的查询...

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;

所以我想从表名返回每一个名字,并且要么是“happy”或“unhappy”的值,即使这些名字可能在心情表中也可能不在。当我编写它时运行它,我没有行。我认为这可能涉及我的mood.type行,因为我不能在“in”语句中使用左连接。

2 个答案:

答案 0 :(得分:9)

我认为你有几个问题:

  1. WHERE子句中有一个虚假的分号。
  2. CASE表达式位置错误。
  3. 你不应该在IN表达式中使用NULL。
  4. 您可以删除分号并将IN表达式改为:

    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
    

答案 1 :(得分: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')