1

我有桌子MemberTransaction. 表Member有 2 列MemberIDMemberName. 表Transaction有 3 列,MemberIDTransactionDateMemberBalance

表中的行如下所示:

Member

MemberID           MemberName
=============================
1                  John
2                  Betty
3                  Lisa

Transaction

MemberID        TransactionDate         MemberBalance
=====================================================
1               13-12-2012              200
2               12-12-2012              90
1               10-09-2012              300

我想MemberID, MemberName查询MemberBalance每个.TransactionDateMemberID

我的查询是这样的:

SELECT 
    t.MemberID, m.MemberName , t.MemberBalance
FROM 
    Member AS m 
INNER JOIN 
    Transaction AS t ON m.MemberID = t.MemberID 
WHERE 
    t.TransactionDate IN (SELECT MAX(TransactionDate)
                          FROM Transaction 
                          GROUP BY MemberID)

此查询返回:

MemberID           MemberName         MemberBalance
===================================================
1                  John               200
2                  Betty              90

我的问题是,我希望查询返回:

MemberID           MemberName         MemberBalance
===================================================
1                  John               200
2                  Betty              90
3                  Lisa               NULL

即使该成员在表格MemberID中不存在,我也希望显示该成员。Transaction

我该怎么做呢?

谢谢你。

4

5 回答 5

5

你也可以使用这样的东西:

SELECT m.MemberID, m.MemberName, t1.MemberBalance
FROM Member AS m 
LEFT JOIN
(
  select max(transactionDate) transactionDate, 
    MemberID
  from Transactions
  group by MemberID
) AS t 
  ON m.MemberID = t.MemberID 
left join transactions t1
  on t.transactionDate = t1.transactionDate
  and t.memberid = t1.memberid

请参阅带有演示的 SQL Fiddle

于 2012-11-09T03:15:10.710 回答
2

即使其 MemberID 在 Transaction 表中不存在也要显示成员

您可以在 Member 表上使用 LEFT JOIN 将行保留到 Transaction 表。

其中 TransactionDate 是每个 MemberID 的最新(最大值)。

从 SQL Server 2005 开始,首选且性能更好的方法是使用ROW_NUMBER()

   SELECT MemberID, MemberName, MemberBalance
     FROM (
   SELECT m.MemberID, m.MemberName , t.MemberBalance,
          row_number() over (partition by m.MemberID order by t.TransactionDate desc) rn
     FROM Member AS m 
LEFT JOIN [Transaction] AS t ON m.MemberID = t.MemberID 
        ) X
    WHERE rn=1;
于 2012-11-09T03:13:00.333 回答
2

要将成员保留在结果集中,您需要外部联接。

另外,请不要忘记在 memberid 上为内部选择查询添加条件,因为当一个用户的最大日期与另一个用户的非最大日期匹配时,您可能会遇到问题(您的 where 条件将为第二个用户传递两次因为他的交易日期会出现在选择的结果中两次,一个是他的实际最大日期,另一个是与非最大日期匹配的某些用户的最大日期)

于 2012-11-09T03:15:23.420 回答
1

你需要使用LEFT JOIN. 此外,您的查询中有一个错误,因为如果两个成员同时有交易,您可以获得两个用户的两行。

试试这个

SELECT t.MemberID, m.MemberName , t.MemberBalance
FROM Member AS m 
    LEFT JOIN Transaction AS t ON m.MemberID = t.MemberID AND t.TransactionDate=
    ( 
        SELECT MAX(TransactionDate)
        FROM Transaction T2
        WHERE T2.MemberID=t.MemberID
    )
于 2012-11-09T03:15:28.370 回答
0
SELECT a.MemberId,a.MemberName,a.MemberBalance
FROM
(
SELECT m.MemberId,m.MemberName,t1.MemberBalance
      ,ROW_NUMBER() OVER(PARTITION BY m.MemberId ORDER BY t1.TransactionDate DESC) AS RN
FROM
@Member m OUTER APPLY (SELECT t.MemberId,t.MemberBalance,t.TransactionDate
                       FROM @Transaction t WHERE m.MemberId=t.MemberId) t1
)a
WHERE a.RN=1
于 2012-11-09T04:46:07.187 回答