0

我慢してください、私はSQLに不慣れで、これを説明するのに苦労しています...

次のような2つのテーブルがあります。

test1
+------+----------+----------+-----------+
|  id  |  serial  |  t1data  |  t1date   |
+------+----------+----------+-----------+
|  1   |    a     |   ...    |  6/02/12  |
|  2   |    a     |   ...    |  6/04/12  |
|  3   |    b     |   ...    |  6/06/12  |
|  4   |    a     |   ...    |  6/08/12  |
+------+----------+----------+-----------+

test2
+------+----------+----------+-----------+
|  id  |  serial  |  t2data  |  t2date   |
+------+----------+----------+-----------+
|  1   |    a     |   ...    |  6/05/12  |
|  2   |    b     |   ...    |  6/07/12  |
|  3   |    b     |   ...    |  6/08/12  |
|  4   |    a     |   ...    |  6/09/12  |
+------+----------+----------+-----------+

の各レコードがの日付より前に発生しtest2た最新のレコードに対応するように、2つのテーブルを結合するクエリを作成したいと思います。任意のシリアルは、いずれかのテーブルに複数のレコードを持つことができます。 test1test2

上記の例を使用すると、結果は次のようになります。

+----------+----------+-----------+----------+-----------+
|  serial  |  t2data  |  t2date   |  t1data  |  t1date   |
+----------+----------+-----------+----------+-----------+
|    a     |   ...    |  6/05/12  |   ...    |  6/04/12  |
|    b     |   ...    |  6/07/12  |   ...    |  6/06/12  |
|    b     |   ...    |  6/08/12  |   ...    |  6/06/12  |
|    a     |   ...    |  6/09/12  |   ...    |  6/08/12  |
+----------+----------+-----------+----------+-----------+

これは私が試したクエリですが、機能しません。

SELECT 
    t2.serial, t2.t2data, t2.t2date, t1a.t1data, t1a.t1date
FROM 
    test2 t2
JOIN 
    test1 t1a ON (t1a.serial = t2.serial AND t1a.t1date > t2.t2date)
LEFT JOIN 
    test1 t1b ON (t1a.serial = t1b.serial AND t1a.t1date < t1b.t1date)
WHERE 
    t1b.serial IS NULL

私はこれをすべて間違っているかもしれませんが、これを機能させるために何ができますか?

4

1 に答える 1

0

これが最善のアプローチかどうかはわかりませんが、機能しています。

SELECT t2.serial, t2.t2data, t1.t1data, t1.t1date
FROM
  (SELECT t2.serial, t2.t2data, t2.t2date,
         (SELECT max(t1date)
            FROM test1 t1
           WHERE t1.serial = t2.serial
             AND t1.t1date <= t2.t2date) AS t1date
  FROM test2 t2) t2
  LEFT OUTER JOIN
   test1 t1 ON t2.serial = t1.serial AND t2.t1date = t1.t1date;

http://www.sqlfiddle.com/#!2/215c263/2

于 2013-02-20T04:19:42.313 に答える