2013-02-15 2 views
-1

У меня есть таблица вроде этого:Как выбрать максимальное значение на второй первичного ключа

id | version | name 
1  1  name1 v1 
1  2  name1 v2 
1  3  name1 v3 
1  4  name1 v4 
2  1  name2 v1 
2  2  name2 v2 
2  3  name2 v3 

Я пытаюсь получить максимальную версию каждого идентификатора на столе с этим запросом:

SELECT a.id, MAX(a.version) AS version, b.name 
FROM table1 a 
INNER JOIN (
SELECT * FROM table1 
) b 
ON a.id = b.id AND a.version = b.version 
GROUP BY a.id 

Но я получаю эти результаты вместо:

id | version | name 
1  4  name1 v1 
2  3  name2 v1 

Когда я должен получить это:

id | version | name 
1  4  name1 v4 
2  3  name2 v3 

Любая помощь будет высоко оценена, спасибо заранее

EDIT:

Я просто понял, что добавление макс (b.name) в операторе отбора делает трюк хехе

Во всяком случае, благодаря @bluefeet, @ user2001117, @rs. и @Bram Gerritsen. Все ваши запросы работают как шарм =)

+0

Что произойдет, если вы добавляете b.name в оператор GROUP BY? – Melanie

+0

Также возможно попробовать ON a.id = b.id AND MAX (a.version) = b.version. Не знаю, является ли это законным синтаксисом, но .... – Melanie

ответ

1
SELECT a.id, a.version, a.name 
FROM table1 a 
INNER JOIN (
SELECT id, max(version) version FROM table1 
GROUP BY id 
) b 
USING(id, version) 
1

сделать

SELECT a.id, a.version, a.name 
FROM table1 a 
INNER JOIN (
SELECT id, max(version) version FROM table1 
GROUP BY id 
) b 
ON a.id = b.id AND a.version = b.version 
1

Попробуйте это:

SELECT a.id, a.version, a.name 
    FROM table1 a 
    INNER JOIN (
    SELECT id, max(version) version FROM table1 
    GROUP BY id 
    ) b 
    ON a.id = b.id AND a.version = b.version 
1

Вы должны изменить ваш запрос, чтобы использовать агрегат в подзапроса. После того, как вы получите max(version) для каждого id в подзапроса вы присоединитесь, что обратно к столу на обоих из этих значений, и он будет возвращать правильный результат:

select a.id, 
    a.version, 
    a.name 
from table1 a 
inner join 
(
    select max(version) MaxVersion, id 
    from table1 
    group by id 
) b 
    on a.id = b.id 
    and a.version = b.maxversion 

См SQL Fiddle with Demo

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