Oracle SQL - 在"in"语句中左连接

Jer*_*emy 2 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;
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 9

我认为你有几个问题:

  1. 你的WHERE子句中有一个虚假的分号.
  2. CASE表达式位于错误的位置.
  3. 您不应在IN表达式中使用NULL.

您可以删除分号并将IN表达式更改为此:

AND (mood.type IN ('Hungry','Tired','Fatigued','Bored') OR mood.type IS NULL)
Run Code Online (Sandbox Code Playgroud)

另外,我强烈建议您不要使用过时的连接语法.使用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
Run Code Online (Sandbox Code Playgroud)