2015-09-24 4 views
0

Я хочу получить последний контракт с последней версией. Внутренний запрос работает, но, к сожалению, мне нужно, чтобы выяснить способ заставить его работать, когда он находится внутри другого запроса ...SQL получить последнюю запись из набора результатов, T-SQL

Это работает:

SELECT * FROM contract t1 
WHERE revisionnum = (select max(revisionnum) 
        from contract t2 
        where t1.contractnum = t2.contractnum)` 

Проблема заключается в том, что он находится внутри select * from contract where заявления, так это выглядит так:

SELECT * 
FROM contract 
WHERE -- this line cannot be changed! 
exists -- not sure about this 
( SELECT * FROM contract t1 
    WHERE revisionnum = (select max(revisionnum) 
         from contract t2 
         where t1.contractnum = t2.contractnum) 
) 

Как это сделать?

+0

Вы выполняете запрос в качестве подзапроса и подаете результат на другой запрос, который просто показывает результат подзапроса. «выберите * from (выберите * из таблицы, где ...)« Почему? Что добавляет внешний запрос к результату? Первый запрос, который вы показываете, - это ответ. – TommCatt

+0

Первый «внешний» запрос - это объект таблицы. Невозможно изменить его –

ответ

1

Я видел кто-то использовать что-то вроде этого раньше ..

SELECT * 
FROM contract 
WHERE 1 = (Select Count(*) 
      From contract c1 
      Where c1.contractnum = contract.contractnum And c1.revisionnum >= contract.revisionnum) 

СУЩЕСТВУЕТ вариант

SELECT * 
FROM [contract] 
WHERE EXISTS (SELECT c1.contractnum, 
         MAX(c1.revisionnum) 
       FROM [contract] c1 
       WHERE c1.contractnum = [contract].contractnum 
       GROUP BY c1.contractnum 
       HAVING MAX(c1.revisionnum) = [contract].revisionnum) 

Ваш исходный запрос был также довольно близок .. вы просто пропустили небольшой фильтр и наложили имена полей, чтобы указать, на какую таблицу вы указывали.

SELECT * 
FROM contract 
WHERE EXISTS -- not sure about this 
      (SELECT * 
       FROM contract t1 
       WHERE contract.contractnum = t1.contractnum -- filter missing 
         AND contract.revisionnum = (SELECT MAX (t2.revisionnum) -- missing table specifier 
                FROM contract t2 
                WHERE t1.contractnum = t2.contractnum) 
      ) 
+0

Wow! Это действительно работало! Nice one :-) –

+0

2-й запрос также работал :-) –

0

ВЫБРАТЬ IDENT_CURRENT ([TABLE_NAME]) AS returnID

+0

Предполагая, что номер версии является вашим основным ключом – rtakhar

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