2016-09-29 6 views
1

私は履歴テーブルを持っていて、そこにメインテーブルにいくつかのトリガを掲示しています。私は履歴テーブルにselect文を作成して、それぞれのレコードが以前のレコード(同じLineIDと最高ActionDateで識別される)でジョインされるようにしたいので、それらの2つの違いを抽出することができます。同じテーブルの前回のレコードを持つテーブルに結合する

私はこれを試してみましたが、(私の)SQLを接合副選択の表の「From」最初への参照を許可していません:不明な列h1.LineID句

select 
    h1.*, 
    prev.* 
from history h1 
LEFT OUTER JOIN 
    (Select * 
    From history h2 
    where h1.LineID=h2.LineID and h2.ActionDate < h1.ActionDate 
    order by Actiondate desc limit 1 
) prev on h1.LineID=prev.LineID 

がどのように私はこれを達成することができますどこに?

+0

これは助けることができませんでしたか? http://stackoverflow.com/questions/15527423/how-to-self-join-table-in-a-way-that-every-record-is-joined-with-the-previous –

答えて

3

あなたは使用して前の行への参照を取得することができます:あなたは完全な行をしたい場合は、データを取得するためにjoinを使用することができます

select h.*, 
     (select h2.ActionDate 
     from history h2 
     where h2.LineId = h.LineId and h2.ActionDate < h.ActionDate 
     order by h2.ActionDate desc 
     limit 1 
     ) as prev_ActionDate 
from history h; 

を:

select h.*, hprev.* 
from (select h.*, 
      (select h2.ActionDate 
       from history h2 
       where h2.LineId = h.LineId and h2.ActionDate < h.ActionDate 
       order by h2.ActionDate desc 
       limit 1 
      ) as prev_ActionDate 
     from history h 
    ) h left join 
    history hprev 
    on hprev.LineId = h.LineId and hprev.ActionDate = h.prev_ActionDate; 
+0

ありがとう!わずかに異なる方法で自分自身で解決しましたが、あなたの解決策もあります – Bascy

1

コードの下に使用してください

select *から履歴をインナー参加履歴としてpre.ActionDate < h.ActionDateとpreL.LineID = h.LineID

お手数ですがお手伝いします。次のコードでそれを自分で解決しよう

+1

INNER JOINは、以前のレコードを持っていないレコードを私に与えます。質問はまだ私のために必要)。それをOUTER JOINに変更すると、以前のActiondateですべてのレコードと一致する結果になりますが、現在の – Bascy

0

select * 
from history h1 
LEFT OUTER JOIN history h2 on h1.LineID=h2.LineID 
    and h2.ActionDate = (select max(actiondate) 
         from history h3 
         where h3.LineID=h1.LineId and h3.Actiondate < h1.ActionDate 
         ) 
order by h1.actiondate desc; 
関連する問題