2017-07-11 7 views
0

2つのテーブル(PEOPLEからINJURIESまで)でもっとも近い日付に参加しようとしていますが、過去1ヶ月以内にレコードがある場合のみです。SQL DB2 LUW V9.7範囲内の最も近い日付に参加

サンプルテーブル/出力:

PEOPLE 

Name   Date 
John Smith 01/01/2016 
Jerry Doe  01/14/2016 
Jane Ellis 02/21/2016 
Adam Patel 03/21/2016 


INJURIES 

Injury  Date 
Broken Hand 12/30/2015 
Broken Wrist 12/31/2015 
Head Pain  01/13/2016 
Broken Hand 02/02/2016 


OUTPUT1 (Able to achieve, but not desired) 

Name   Injury 
John Smith Broken Hand 
John Smith Broken Wrist 
Jerry Doe  Broken Hand 
Jerry Doe  Broken Wrist 
Jerry Doe  Head Pain 
Jane Ellis Broken Hand 
Adam Patel {null} 

OUTPUT2 (Desired Output) 

Name   Injury 
John Smith Broken Wrist 
Jerry Doe  Head Pain 
Jane Ellis Broken Hand 
Adam Patel {null} 

私は、プロセスのどの段階でOUTPUT1取得せずに参加行うことができます方法はありますか?私はかなりの数のレコードを扱っており、可能な限り小さな計算力でこの結合をしたいと考えています。

+0

これは宿題ですか? (日付だけに基づいて人に怪我を負わせようとする実際のアプリケーションを想像するのは苦労します)。 –

+0

いいえ、私がしようとしているのは、疼痛提供者が最後に行った診断の処方箋と結びつけることです。残念ながら、処方箋の情報と医者への訪問は、2つの別々の表に記載されています。 –

+0

2つのテーブルがあるかもしれませんが、共通のキーを持つべきです - 日付はそれを行うための有用なキーではありません - コンポーネントであってもキーではないかもしれません – MichaelTiefenbacher

答えて

0

これは悪いデザインがあるにもかかわらず、このクエリは、あなたが望む結果を返します。

select 
    p.name, 
    (select injury 
     from injuries x 
     where x.date between p.date - 1 month and p.date 
     order by x.date desc 
     fetch first 1 row only) 
from 
    people p; 

あなたは、パフォーマンス上の理由から、いくつかの追加の詳細を提供する必要があると思いますが、チャンスは、あなたがしたいと思うことをしていますINJURIES.DATE(好ましくは降順)のインデックスを有することが好ましい。

日付だけを使用すると、誤ったデータを取得するのに適しているように見えるため、テーブルに参加するための適切なキーを探すことをお勧めします。

+0

このイアンをありがとう、これは私が探していた答えでした。私は適切な鍵がないことの結果を認識しますが、この解決法は私の現在の状況から私が持っているデータを最大限に活用します。 –

関連する問題