2017-02-08 6 views
2

私は2つのテーブルをアクセスしており、共通の列(dest)に基づいて結合を行う必要があり、テーブルAのそれと等しいかそれより前のテーブルB 。クエリにアクセスして2つのテーブルを結合する最短時間に基づく

券(表A)

ID | dest | land 
1 | SUN | 1/1/2017 8:52:00 AM 
2 | SEA | 1/1/2017 4:39:00 AM 

天気(表B)

ID | dest | time    | vis 
1 | SUN | 1/1/2017 8:15:00 AM | 10 
2 | SUN | 1/1/2017 8:35:00 AM | 5 
3 | SUN | 1/1/2017 8:55:00 AM | 2 
4 | SEA | 1/1/2017 2:48:00 AM | 7 
5 | SEA | 1/1/2017 3:52:00 AM | 10 
6 | SEA | 1/1/2017 4:49:00 AM | 2 

所望の結果(表C)

ID | dest | land    | time    | vis 
1 | SUN | 1/1/2017 8:52:00 AM | 1/1/2017 8:35:00 AM | 5 
2 | SEA | 1/1/2017 4:39:00 AM | 1/1/2017 3:52:00 AM | 10 

私は 'dest'と最も近い時間の両方に参加する方法につきました。表Aには約25,000行、表Bには約100,000が含まれています。私はこのようにそれを行うだろう

答えて

1

:また

SELECT Flights.dest, Flights.land, 
(select time from weather 
    where id = (select top 1 id 
       from weather 
       where dest=flights.dest and time <= flights.land 
       order by time desc)) AS [time], 
(select vis from weather 
    where id = (select top 1 id 
       from weather 
       where dest=flights.dest and time <= flights.land 
       order by time desc)) AS vis 
FROM Flights; 

、同じ結果がこのクエリで達成することができます。これらのソリューションを提供するための

SELECT Flights.dest, Flights.land, 
weather.time, weather.vis 
FROM Flights INNER JOIN weather ON Flights.dest = weather.dest 
WHERE weather.time = (
    select top 1 time 
    from weather 
    where dest=flights.dest and time <= flights.land 
    order by time desc); 
+0

感謝を。私は最初のオプションを試して、 'time <= flights.land'の部分が含まれていたときにクエリを完了することができませんでした。クエリは実行されますが、少量のデータでも完了することはありません。 2番目のソリューションをINNER JOINで使用すると、わずかなデータセットで〜4分で完了しますが、21分後に完全なデータセットを使用すると、まだ完全ではありませんでした。それを高速化するための提案、またはおそらく2ステップのプロセスですか?私は、クエリで使用されたフィールドのインデックスを作成しました。 –

+0

両方のテーブルの 'dest'カラムと、フライトテーブルの' land'カラムと天気表の 'time'カラムのインデックスが必要です。私は 'ID'がプライマリキーであると仮定します - それでインデックスは必要ありません – cha

関連する問題