2017-04-13 13 views
1

子テーブル(テーブル2)にレコードを挿入することによって発生するワークフロー(送信、承認など)を持つレコードがあります(Table1)。たとえば、Table1のレコードが送信されると、ワークフローステータス(StatusField)、日付、およびユーザーが送信しているTable2の対応するレコードが挿入されます。私はその後、その状況(例えば、提出されたレコードのみ)に基づいてTable1にクエリを試みるとき、私は最も効率的な方法を理解しようとしており、わかりません。私は、Table1のPKがパラメータである関数を作成しようとしましたが、それは一致するFKを持つTable2からの最新のStatusfieldをキックアウトします。また、FKでグループ化されたMax PKのTable2のPKでViewを作成し、LEFT OUTER JOIN(Table2の対応するレコードがないため、ステータスが保留中であることがあるため)でリンクしました。より速く見える方法は、次のようにサブクエリを実行することです。子テーブルからステータスを取得する最も効率的な方法

SELECT a.* 
    ,(SELECT TOP 1 StatusField 
     FROM Table2 b 
     WHERE b.FK=a.PK 
     ORDER BY b.DateField DESC) StatusField 
FROM Table1 a 
WHERE (SELECT TOP 1 StatusField 
     FROM Table2 b 
     WHERE b.FK=a.PK 
     ORDER BY b.DateField DESC)='Submitted' 

私はまだ良い方法があるように感じています。何かご意見は?誰かが私にポイントすることができる同様の質問と回答があれば、それも素晴らしいでしょう。ありがとうございました!

答えて

1

一つの可能​​な解決策(質問は、MySQLをタグ付けされた) - STATUSFIELDが送信されたかどうかを確認するために、次に、各FKの最大日付フィールドを取得する表2に戻って参加する派生テーブルを使用....

select a.* 
    , b.StatusField 
    from table1 a 
    join (select fk 
      , max(datefield) datefield 
      from table2 
     group by fk) max on (max.fk = a.fk) 
    join table2 b on (b.fk = a.fk and b.datefield = max.datefield) and b.StatusField = 'Submitted'); 
+0

この作品どれくらい速いかはまだ分かりませんが、すぐにテストされます。このような迅速な対応をありがとう! – Julian

+0

これをスピードアップする1つの方法...派生テーブルを物理テーブルの最大値にして索引付けします。これにより、table1への結合が高速化され、table2がインデックス(fk、datefield)を介して最大結果に直接結合されます。がんばろう! – RMathis

+0

これは速く、ありがとう! – Julian

関連する問題