2016-06-15 31 views
-1

Oracleデータベースから複数のテーブルにヒットするかなり複雑なSQLクエリを実行しています。私は2つのキー列を持っており、このような種類の見える新しいテーブルからデータを持参しようとしています:SQL文のwhere句の条件文

key1 key2 date 
001   2016-06-12 
001 0001 2016-06-13 
002   2016-06-14 
003   2016-06-15 
003 0001 2016-06-16 
... 

デフォルトことになっているすべての固有キー1値、にNULL KEY2レコードがありますkey2が存在しない場合私の現在のクエリは次のとおりです。

SELECT ..., (variables from other tables) 
     newtable.date 
    FROM ..., (other database tables) 
     newtable 
WHERE ..., (whole bunch of table links) 
    AND newtable.key1 = keytable.key1 
    AND (newtable.key2 = keytable.key2 OR newtable.key2 IS NULL) 

これは私のNEWTABLEですべてを提供しますが、私は、各キー1値の一意のレコードが必要です。私はクエリがNULLでないkey2レコードの日付を返すようにしたい場合は、NULLキー2レコードの日付を返します。

私はこれに関する助けに感謝します。

+0

私たちはあなたの期待する結果を教えてください。KEEP FIRSTをサブクエリーで入手できます。また、完全なソリューションが必要な場合は、他のテーブル情報が必要です。あなたが他のテーブルを必要としないと思うなら、簡単な問題を提供してください。 [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [** START **](http ://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を向上させ、より良い回答を得る方法を学ぼう。 –

答えて

1

オラクルは、リストの「ベスト」レコードから値を選択するためにKEEP FIRSTを提供しています。最高のレコードの日付が必要です。

SELECT 
    <columns from other tables>, 
    (
    select max(n.date) keep (dense_rank first order by n.key2 nulls last) 
    from newtable n 
    where n.key1 = k.key1 
    and (n.key2 = k.key2 OR n.key2 is null) 
) as newtable_date 
FROM keytable k 
JOIN <other database tables> 
WHERE ... 
+0

それは私が予想していたより少し混乱しましたが、うまくいきました。ありがとう! – bentwells