2011-11-17 10 views
2

を取得するために参加します過去の)およびそれに関連するイベント値データを含む。SQLは、私は3つのテーブルを持って最新の記録

私の現在のクエリは非常に醜いです:

SELECT 
    M.*, 
    (SELECT TOP 1 EV.value FROM [Event] E JOIN EventValues EV ON E.EventID = EV.EventID 
    WHERE M.Time >= E.Time ORDER BY M.Time-E.Time) AS Data, 
FROM [Measure] M 
ORDER BY M.Distance 

、それは私だけが

が、これは使用して行うことができる任意の方法があります(私はもっと必要) EventValuesテーブルから1列を選択することができます参加しますか?

EDIT:私はまた、あなたが適用CROSSを使用することができます

+0

のようなものを試してみてください?外来キーはありません。時間価値を介して関連していますか? – Zohaib

+0

はい時間でのみ – Simon

+1

最新のイベントに対して2つのEventValueレコードがある場合、その場合の期待は何ですか?両方のレコード、またはそれらの1つだけを表示するには?また、テンポラリテーブルは受け入れ可能ですか? – mjwills

答えて

1

(すなわち、ただ参加するためのヌルデータを選択)、彼らは最初のイベントの前にある場合でも、測定テーブルからすべてのエントリを選択する必要があります。

SELECT 
    M.*, Data.* 
FROM [Measure] M 
CROSS APPLY 
    (SELECT TOP 1 EV.* FROM [Event] E JOIN EventValues EV ON E.EventID = EV.EventID 
    WHERE M.Time >= E.Time ORDER BY E.Time DESC) AS Data 
ORDER BY M.Distance 
+0

+1このクエリは(ほぼ)うまくいきますが、最初のイベントの前にある測定テーブルのエントリを含める方法があります – Simon

+0

CROSS APPLYの代わりにOUTER APPLYを使用すると、データ "(EventValues)列。 – GilM

+0

私はamit-gよりもこの答えを受け入れていますが、どちらも正しい結果を生み出しますが、私の状況は良くなります。 – Simon

1

この(テストしていない)

SELECT * FROM 
(
    SELECT M.*, E.*, EV.EventDataID, EV.Type, EV.Value, 
     Rank() over (Partition BY M.MeasureID order by M.Time - E.Time) as Rank 
    FROM [Measure] M 
    INNER JOIN [Event] E ON M.Time >= E.Time 
    INNER JOIN EventValues EV ON E.EventID = EV.EventID 
) T 
WHERE Rank = 1 

測定およびイベントのテーブルがrealtedされているどのようにEDIT

SELECT * FROM 
(
    SELECT M.*, E.*, EV.EventDataID, EV.Type, EV.Value, 
     Rank() over (Partition BY M.MeasureID order by M.Time - E.Time) as Rank 
    FROM [Measure] M 
    LEFT JOIN [Event] E ON M.Time >= E.Time 
    LEFT JOIN EventValues EV ON E.EventID = EV.EventID 
) T 
WHERE Rank = 1 
+0

+1このクエリは(ほぼ)うまくいきますが、最初のイベントの前にある測定テーブルのエントリを含める方法がありますか? – Simon

関連する問題