2013-09-22 47 views
1

在工作中,我經常必須找到每個外鍵的最大狀態。我大部分時間總是在連接上使用相關的子查詢來獲得正確的記錄。這是假定最高主鍵是最近的。這裏是一個小的演示

根據外鍵找到表的最大記錄的最佳方法是什麼?

select 
    c.plate_number, o.name 
from 
    Car c 
    inner join Owner o 
     on o.owner_id = (
      select max(owner_id) 
      from Owner 
      where owner_type = 'PRIMARY' 
     ) 


這是我用的,更不要說能夠把額外的條件在子查詢類型列大多數查詢非常快。我試圖使用NOT EXIST子句來確保沒有更高的記錄,但是找不到其他東西。有人可以提出更好的建議嗎?

+0

什麼是汽車和業主之間的關係表? –

+0

如果您想要最近的記錄,請使用日期時間字段。那麼你不必做出假設。 –

+0

如果我正確理解你,你的意思是查詢只返回一行? –

回答

0

我建議使用sandard窗口函數....

;with cte as (
    select c.plateNumber, o.name, 
      row_number() over (partition by c.ownerId order by purchaseDate desc) rw 
    from car c 
     inner join owner o 
      on o.ownerid = c.ownerid 
) 
select * 
from cte 
where rw=1; 

可以讓你得到什麼,你或者從表想,仍然只能獲得一個記錄

+0

我應該更清楚我的問題。我想以一對多的關係獲取每條父記錄的最新兒童記錄。 – user1281598

+0

這正是你允許你做的事情。只需將你想要的額外列按行數放入select中,然後按照你用來定義「最近」的列來排列順序。如果沒有完整的專欄列表,我認爲有一個「已購買」專欄,但它可能是lastupdated,id,無論您使用什麼。 – jmoreno

+0

我通常只使用PK,因爲這是最高記錄最新的標準。但回到主要觀點,使用窗口/排名功能的版本更好嗎? – user1281598

相關問題