SQL:嵌套子查询错误地返回条目

问题描述

我在使用嵌套子查询查询数据集时遇到了一些麻烦,我认为这很简单。

我有一张客户及其地址dbo.PERSON_ADDRESSES的表,以及与客户dbo.TRANSACT_CUSTOMERS的交易。随着时间的推移,客户在dbo.PERSON_ADDRESSES表中存储多个地址是很常见的。我只是想将dbo.TRANSACT_CUSOMTERS表中的最新事务用于dbo.PERSON_ADDRESSES表中的最新地址的表。

当我独立运行内部子查询时,它运行良好:它显示了我所设想的每个客户的最近一笔交易。但是,由于某种原因,当我运行整个查询时,每个客户获得的地址很多。我不明白为什么。

SELECT MaxTransaction.PERSON_ID,Addr.*
FROM dbo.PERSON_ADDRESSES AS Addr
INNER JOIN
   (SELECT PERSON_ID,Max(TRANSACTION_ID) AS MaxTID
    FROM dbo.TRANSACTION_CUSTOMERS 
    GROUP BY PERSON_ID) AS MaxTransaction
ON MaxTransaction.MaxTID = Addr.TRANSACTION_ID

解决方法

我猜一个交易可以有多个客户。要获得每人一行,请使用其他JOIN条件:

SELECT maxp.PERSON_ID,pa.*
FROM dbo.PERSON_ADDRESSES pa JOIN
     (SELECT PERSON_ID,Max(TRANSACTION_ID) AS MaxTID
      FROM dbo.TRANSACTION_CUSTOMERS 
      GROUP BY PERSON_ID
     ) maxp
     ON maxp.person_id = pa.person_id AND
        maxp.MaxTID = pa.TRANSACTION_ID;