Есть несколько способов, которыми вы можете достичь этого.
Следующие примеры предполагают, что ваша таблица с именем, table1
и что ваши поля id
, class
, version
и fruit
(не fruit?
) - изменить эти по мере необходимости в соответствии с вашими данными.
Примечание. В следующих примерах предполагается, что ваше fruit
поле является текстовым полем. Если ваше fruit
поле на самом деле является логическим (да / нет), то удалите одинарные кавычки 'No'
в следующих примерах.
Используя объединенный подзапрос:
select u.id, u.class from table1 u inner join ( select t.id, max(t.version) as mv from table1 t where t.fruit = 'No' group by t.id ) v on u.id = v.id and u.version = v.mv
Здесь подзапрос выбирает наибольшее значение version
для каждой id
записи, где fruit = 'No'
он затем присоединяется к полному набору данных, чтобы вернуть обязательные поля для каждого id
и version
.
Используя коррелированный подзапрос:
select t.id, t.class from table1 t where t.fruit = 'No' and not exists (select 1 from table1 u where u.id = t.id and u.fruit = 'No' and u.version > t.version)
Здесь выбор выполняется полностью в рамках WHERE
предложения, которое для каждой записи проверяет, существует ли еще одна запись в наборе с таким же id
и большим значением version
, и если да, то запись не возвращается.
Использование LEFT JOIN
с неравными критериями соединения:
select t.id, t.class from table1 t left join table1 u on t.id = u.id and t.version < u.version where t.fruit = 'No' and u.id is null
Этот пример может быть представлен только в MS Access в представлении SQL, поскольку конструктор запросов MS Access не может отображать объединения, которые имеют равные критерии соединения (т. Е. Когда одно поле равно другому).
Этот пример аналогичен по работе коррелированному подзапросу, но выбор выполняется соединением, а не в WHERE
предложении.
Наконец, обратите внимание, что ваш приведенный пример результата неверно: class
для максимального version
для id = 'Onion'
должно быть WEST
, не SOUTH
.