2

EmpID、、、の3つのフィールドを持つアドレス履歴テーブルがありAddressますAddrID

新しい住所を追加するたびに、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、および2つに関連付けられたすべてのアドレス)か、結果が少なすぎる(つまり、AddrID 4を持つすべての従業員-従業員2だけ)。

、、、、、および自己結合を使用してみましたが、役に立ちませんでしDistinctGroup ByOrder ByHaving

私は何が欠けていますか?

4

3 に答える 3

5

MAX()各 empidの addrid を取得するサブクエリを使用できます。

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次に、これらの 2 つの値でテーブルをその結果に結合すると、返されるレコードが制限されます。

于 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 に答える