2

我有一个包含三个字段的地址历史记录表:EmpIDAddressAddrID

每次添加新地址时,我也会AddrID将该特定员工的地址 ID ( ) 加 1。

EmpID | AddrID | Address
-------------------------------
 1    |     1  | 1234 First Ave
 1    |     2  | 2145 First Ave
 1    |     3  | 1111 First Ave

 2    |     1  | 1001 Second St
 2    |     2  | 1002 Second St
 2    |     3  | 1003 Second St
 2    |     4  | 2222 Second St

 3    |     1  | 3332 Third Lane
 3    |     2  | 3333 Third Lane

 4    |     1  | 4444 Fourth Way

如何获取每位员工的最新地址(最高地址 ID)?理想情况下,我应该能够返回:

EmpID | AddrID | Address
-------------------------------
 1    |     3  | 1111 First Ave
 2    |     4  | 2222 Second St
 3    |     2  | 3333 Third Lane
 4    |     1  | 4444 Fourth Way

到目前为止,我返回的结果要么太多(即,每个员工、每个 AddrID 1 以及与这两者关联的每个地址),要么返回的结果太少(即,每个具有 AddrID 4 的员工 - 只有员工 2)。

我尝试使用Distinct, Group By, Order By,Having和 Self-Joins 无济于事。

我错过了什么?

4

3 回答 3

5

您可以使用子查询来获取MAX()每个 empid 的地址:

select t1.empid,
  t1.addrid,
  t1.address
from table1 t1
inner join
(
  select max(addrid) addrid, empid
  from table1
  group by empid
) t2
  on t1.empid = t2.empid
  and t1.addrid = t2.addrid

请参阅带有演示的 SQL Fiddle

内部查询将返回最大值addridempid然后您将表加入到这两个值的结果中,这将限制返回的记录。

于 2012-10-04T21:11:29.690 回答
4

以下应该有效:

SELECT * 
FROM   (SELECT empid, 
               Max(addrid) AS AddrID 
        FROM   t1 
        GROUP  BY empid) a 
       JOIN t1 b 
         ON b.empid = a.empid 
            AND b.addrid = a.addrid 

看到它在行动

于 2012-10-04T21:14:40.983 回答
0

我可能会以不同的方式组织表格,但您可以使用子连接做一些事情

    select * from address_history 
    join 
    (select EmpID, max(AddrID) max_address from Address_History group by empId) as latest_addresses 
       on address_history.empid = latest_addresses 
       and address_history.addrId = latest_addresses.max_address 
于 2012-10-04T21:11:50.710 回答