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

请注意,只有一个用户,但位置不同。这是基于用户在指定日期移动到另一个位置的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 Fiddle)。

于 2012-08-31T03:35:01.123 回答