0

3つのテーブルがあるとします。

A) Table UsrHeader
   -----------------
   UsrID  |  UsrName
   -----------------
   1      |  Abc
   2      |  Bcd

B) Table UsrDetail
   -------------------------------
   UsrID  |  UsrLoc  | Date
   -------------------------------
   1      |  LocA    | 10 Aug 2012
   1      |  LocB    | 15 Aug 2012
   2      |  LocA    | 10 Aug 2012

C) Table Trx
   -----------------------------
   TrxID  |  TrxDate     | UsrID
   -----------------------------
   1      |  10 Aug 2012 | 1
   2      |  16 Aug 2012 | 1
   3      |  11 Aug 2012 | 2

私がやりたいのは、次のようなテーブルを表示することです。

  ---------------------------------------
  TrxID   |  TrxDate     | UsrID | UsrLoc
  ---------------------------------------
  1       |  10 Aug 2012 | 1     | LocA
  2       |  16 Aug 2012 | 1     | LocB
  3       |  11 Aug 2012 | 2     | LocA

ユーザーは1人ですが、場所が異なることに注意してください。これは、指定された日付のユーザーが別の場所に移動したUsrDetailテーブルに基づいています。したがって、すべてのトランザクションで、その日付のユーザー固有の場所を表示する必要があります。

私はこのコードを試しましたが、運がありませんでした:

SELECT trx.TrxID, trx.TrxDate, trx.UsrID, User.UsrName, User.UsrLoc
FROM trx
INNER JOIN
( SELECT UsrHeader.UsrID, UsrHeader.UsrName, UserDetail.UsrLoc
  FROM UsrHeader
  INNER JOIN
  ( SELECT UsrDetail.UsrID, UsrDetail.UsrLoc, UsrDetail.Date
    FROM UsrDetail
  ) AS UserDetail ON UserDetail.UsrID = UsrHeader.UsrID
) AS User ON User.UsrID = trx.UsrID
             AND trx.TrxDate >= User.Date

どうやってするか?ありがとう。

4

1 に答える 1

4

以下を使用してください。

SELECT trx.TrxID, trx.TrxDate, uh.UsrName, ud.UsrLoc
FROM trx 
     INNER JOIN UsrDetail ud ON (trx.UsrId = ud.UsrId)
     INNER JOIN UsrHeader uh ON (trx.UsrId = uh.UsrId)
WHERE ud.Date = (SELECT MAX(t.Date)
                 FROM UsrDetail t
                 WHERE t.UsrId = trx.UsrId
                   AND t.Date <= trx.TrxDate)

これがデモ(SQLフィドル)です。

于 2012-08-31T03:35:01.123 に答える