2016-10-25 5 views
2

最初の結果を取得する必要があります。最初の値Oracleでnullを返す関数

私は

select id,firstname,dob,assignment 
from (
    select table1.id as id, 
      table1.name as firstname, 
      table1.dob as dob, 
      First_value(table2.Res)over (partition by table2.id order by table2.date asc) f, 
      table2.Res as assignment 
    from table1,table2 
    where table1.id = table2.id and 
) where assignment = f 

は、table2の中にレコードがないと仮定しましょう動作を行うため、以下のクエリを使用しています。その場合、私の予想出力は、表2のレコードがある場合、クエリが正常に動作します

id firstname dob   assignment 
1 Ana   23/03/1960 null 

でなければなりません。しかし、上記のクエリは、table2の特定の従業員のレコードがない場合、結果を返しません。

+0

'... table1.id = table2.idをして)' *構文ですエラー* –

+0

from table1、table2 table1.id = table2.idはINNER JOINなので、table2が空の場合、結果はゼロです。 LEFT OUTER JOIN –

答えて

1

はこのお試しください:

SELECT id,firstname,dob,assignment 
FROM (
     SELECT table1.id as id, 
       table1.name as firstname, 
       table1.dob as dob, 
       First_value(table2.Res)over(partition by table2.id order by table2.date asc) f, 
       table2.Res as assignment 
     FROM table1 
     LEFT JOIN table2 ON table1.id = table2.id 
) WHERE (assignment = f OR (assignment IS NULL AND f IS NULL)) 
+0

いいえ運はまだありません –

+1

ちょうど 'f'が列であることを忘れました - お試しください –

+1

ありがとう:) –

1

コメントが長すぎます。

もちろん、テーブルの1つが空の場合、クエリは行を返しません。これは、クロスジョインとインナージョイントの仕組みです。

おそらくあなたはleft joinとシンプルなクエリをしたい:

select t1.id as id, t1.name as firstname,t1.dob as dob, 
     First_value(t2.Res)over (partition by t2.id order by t2.date asc) f, 
     t2.Res as assignment 
from table1 t1 left join 
    table2 t2 
    on t1.id = t2.id and t2.Res = 'f'; 
+0

'で試してください。' t2'に行がない場合、 't2'のすべてのフィールドがnullになるので、' t2.Res = 'f''は問題になります。 –

+0

私は左の結合も使ってみました。まだ2番目のテーブルにエントリがない場合は結果を返しません –

関連する問題