Oracle SQL - левое соединение в операторах "in" - PullRequest
2 голосов
/ 11 февраля 2012

Цель запроса ниже - вернуть список людей и узнать, несчастны они или нет.Но, если я не знаю, счастливы ли они или нет, я хочу указать их имя и их несчастные как «счастливые».Это усложняется тем фактом, что у меня есть некоторые дополнительные требования для определения несчастного.

Я пишу запрос, подобный этому ...

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".

Ответы [ 2 ]

9 голосов
/ 11 февраля 2012

Я думаю, у вас есть пара проблем:

  1. В вашем предложении WHERE есть ложная точка с запятой.
  2. Выражение CASE находится не в том месте.
  3. Вы не должны использовать NULL в выражении IN.

Вы можете удалить точку с запятой и заменить вместо нее выражение 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
0 голосов
/ 13 февраля 2012

Я бы сделал это так:

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...