2015-08-12 2 views
-1

Вот запрос:Объясните, как работает этот подзапрос SELECT WHERE?

SELECT ID, Name, EventTime, State 
FROM mytable as mm Where EventTime IN 
(Select MAX(EventTime) from mytable mt where mt.id=mm.id) 

Вот скрипка: http://sqlfiddle.com/#!3/9630c0/5 Это происходит из этого С.О. вопрос: Select distinct rows whilst grouping by max value

Я хотел бы услышать на простом английском языке, как это работает. Мне не хватает фундаментального понимания его части.

Я действительно не понимаю, что делают псевдонимы в части mt.id = mm.id. Он выбирает строки, где id равен id?

+0

вы можете выбрать один из той же таблице несколько раз в одном запросе, читать о Самосоединения и псевдонимами. 'mt' и' mm' позволяют вам и машине различать записи, используемые в оценке. – Bulat

+0

Обратите внимание, что если вы читаете комментарии (а затем есть еще один подобный ответ), 'IN' бесполезен, и вы можете использовать' EventTime = (Select MAX' – xanatos

ответ

1

Часть mt.id=mm.id делает ее correlated subquery, поэтому подзапрос переоценивается для каждого идентификатора.

Запрос затем выбирает самое последнее событие для каждого идентификатора.

+0

Спасибо, я не знал о коррелированных подзапросах. заявление является inneficient, и тот, который написал @Madhivanan, скорее всего, будет более эффективным в более крупной таблице, потому что он не будет выполняться один раз в строке. Спасибо за терминологию и ссылку. Извините, я не могу дать вам обе выгоды из правильного ответа вы оба были полезны. – adjenks

+0

@adjenks - он * может * быть неэффективным, но вы не должны предполагать. Во-первых, разница в производительности может быть не заметна. Для другого оптимизатор запросов может делать некоторые довольно умные вещи В SQL вы указываете системе *, что хотите, а не * как это сделать *, а затем оптимизатор пытается найти наилучший способ сделать это. –

1

В основном это переведено на «Получите данные для каждого идентификатора с максимальным значением EventTime, связанным с».

Вы также можете переписать код как

SELECT t1.ID, t1.Name, t1.EventTime, t1.State FROM mytable as t1 
inner join 
(
select id,max(EventTime) as EventTime from mytable group by id 
) as t2 on t1.id=t2.id and t1.EventTime=t2.EventTime