下のサイトにあるように、異なるテーブルの列同士をwhereで比較した場合(6行目 c1.timestamp > c.timestamp)、内部的にはどのような処理が行われるのでしょうか?
stackoverflow.com/questions/4070476/sql-query-to-join-two-tables-based-off-closest-timestamp
sqlの内容としては、Classificationの行でtimestampがテーブルClosed Casesのtimestamp以前のものをマージするという内容になっています。
table
1Closed Cases 2| id | resolution | timestamp | 3------------------------------------------------ 4| 1 | solved | 2006-10-05 11:55:44.888153 | 5| 2 | closed | 2007-10-07 12:34:17.033498 | 6| 3 | trashed | 2008-10-09 08:19:36.983747 | 7| 4 | solved | 2010-10-13 04:28:14.348753 | 8 9Classification 10| id | value | timestamp | 11------------------------------------------------- 12| 1 | freshman | 2006-01-01 12:02:44.888153 | 13| 2 | sophomore | 2007-01-01 12:01:19.984333 | 14| 3 | junior | 2008-01-01 12:02:28.746149 | 15 16desired result 17| id | resolution | timestamp | value | 18-------------------------------------------------------------- 19| 1 | solved | 2006-10-05 11:55:44.888153 | freshman | 20| 2 | closed | 2007-10-07 12:34:17.033498 | sophomore | 21| 3 | trashed | 2008-10-09 08:19:36.983747 | junior | 22| 4 | solved | 2010-10-13 04:28:14.348753 | junior |
sql
1SELECT case.id, case.resolution, case.timestamp, class.value 2 FROM closed_cases AS case 3 LEFT JOIN (select c.*, 4 (select min(timestamp) 5 from classifications c1 6 where c1.timestamp > c.timestamp) timeend 7 from classifications c) AS class 8 ON case.timestamp >= class.timestamp and 9 (case.timestamp < class.timeend or class.timeend IS NULL) 10 WHERE case.timestamp BETWEEN $1 AND $2;
目的から推測するとc1.timestampの各値について、cのtimestampがc1.timestampの一つの値より小さいcの行をまとめて取ってきて、その行たちについてmin(timestamp)を計算しているように思えます。
同じテーブルの2つの列を比較する場合は単純にwhereの条件を満たす行を取ってくるだけだと思うのですが、このように異なるテーブル間の列同士の比較は内部的にどのような処理が行われるのか教えていただけると助かります。