2013-09-22 4 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

Если вы хотите использовать самые последние записи, используйте поле datetime. Тогда вам не нужно делать предположения. –

+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

Я обычно просто использую ПК, поскольку это был стандарт, который является самой высокой записью. Но вернемся к главному, что лучше о вашей версии, используя функцию windowing/ranking? – user1281598

Смежные вопросы