2012-02-10 15 views
2

以下の問合せのポイントは、人のリストとそれらが不満であるかどうかを戻すことです。しかし、もし彼らが幸せであるかどうかわからないなら、私は彼らの名前と不幸を「幸せ」として挙げたいと思います。これは、私が不幸を定義するためのいくつかの追加要件があるという事実によって複雑になります。Oracle SQL - "in"文の左結合

私はだから私はにもかかわらず、テーブル名からすべての単一の名前を返すようにしたい、と「幸せ」や「不満」のいずれかの値...

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; 

をこのようなクエリを書いていますそれらの名前は気分表にある場合とそうでない場合があります。私がこれを書いたようにこれを実行すると、私は行を得ません。私は "in"ステートメントで左ジョインを使用することができないので、これは私のムードを伴う可能性があると考えています。

+0

あなたはmood.type条件をコメントしようとあなたが任意の行を取得かどうかを確認しましたか?残りの条件が正しいことを確認するだけです。 –

+0

良い考え。これがうまくいかない場合は、次に確認します。 – Jeremy

答えて

9

私は、あなたが問題のカップルを持っていると思う:

  1. あなたのWHERE句に偽のセミコロンを持っています。
  2. CASE式の位置が間違っています。
  3. IN式でNULLを使用しないでください。

あなたは、セミコロンを削除し、代わりにこれにあなたの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

クエリが実行されているかどうか確認してください。しかし、他のsnytaxのように、さあ、それは素晴らしいです!すべての左ジョインのものをグループ化できます。私は構文について少し混乱しています。もし私が書いていたら、例えば、右のジョイン・ムード(それ以外のもの)? – Jeremy

+1

@マーク: 'CASE'も間違っているようだ。 –

+0

@マークあなたは絶対に正しいです。実際のクエリでは、適切な場所(selectステートメント)にあります。私は私の質問でそれを移動します。 – Jeremy

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') 
関連する問題