2015-06-08 4 views
0

Я не очень разбираюсь в SQL, поэтому извините меня за вопрос новичков. Также для моего основного английского.SQL: MAX и SELECT TOP 1

Мне нужно извлечь из таблицы значение строки (строк) с максимальной датой. Проблема в том, что я могу выбрать только некоторые строки, и условия рассмотрят также другие таблицы, поэтому для получения правильных строк мне нужно сделать некоторые соединения с этими другими таблицами.

Обычно (используя только одну таблицу), чтобы решить эту проблему, я использую оператор SQL, как этот:

SELECT t1.value 
FROM table t1 
INNER JOIN (SELECT MAX(date) as maxDate 
    FROM table 
    WHERE field=3) t2 
ON t1.date=t2.maxDate 
WHERE t1.field=3 

Теперь, в случае, если я имею в виду, я должен был бы сделать что-то вроде:

SELECT t1.value 
FROM table t1 
INNER JOIN otherTable o1 ON o1.key=t1.oKey 
INNER JOIN (SELECT MAX(date) as maxDate 
    FROM table t2 
    INNER JOIN otherTable o2 ON o2.key=t2.oKey 
    WHERE t2.field=3 and o2.oField=10) t3 
ON t1.date=t3.maxDate 
WHERE t1.field=3 and o1.oField=10 

Но это решение кажется неэффективным для меня, потому что я должен «дублировать» все соединения и стыки условия.

Есть ли другой способ сделать это? Мне не нужно, чтобы извлечь все результаты (может быть больше, чем один), так что я думал, также в этом растворе:

SELECT TOP 1 t.value 
FROM table t 
INNER JOIN otherTable o ON o.key=t.oKey 
WHERE t.field=3 and o.oField=10 
ORDER BY t.date DESC 

Но я не уверен, что результат будет правильным: это первый сортировать результаты, а затем выберите верхнюю часть 1? Другими словами: могу ли я быть уверенным, что строка совпадает с максимальной датой?

Кроме того, является ли второй метод более эффективным?

Спасибо, ребята!

+2

ЗЕЬЕСТ всегда выполняется в конце запроса да так, если вы отборный вершину вы будете получить первый после сортировки –

ответ

2

также обсуждалась разница между MAX и TOP 1 на эти посты:

MAX vs Top 1 - which is better?

SQL performance MAX()

+0

Вторая ссылка более подробная, теперь я выполняю некоторые проверки, как предлагал этот ответ. Спасибо за помощь! – Deboroh88

0

Чтобы ответить на ваш вопрос, select top 1 и max не то же самое. Select top 1 вернет вам первую строку набора результатов, неважно, какая дата/данные в этой строке.

Если вы используете select top 1 date from table order by date desc, вы получите дату max, так что не беспокойтесь.

Select max(date) всегда будет давать вам самую высокую дату, а точнее последнюю дату.

+0

благодарю вас за ответ! Хотя, мой титул был не очень конкретным для моего реального вопроса, извините. В любом случае, можете ли вы также сказать мне, какое решение более эффективно? даже с огромным количеством рядов? Я боюсь, что порядок со многими строками может быть слишком медленным. – Deboroh88

+0

подробно объясняется в ссылках, которые размещены @sbiz, просто проверьте это;) – theweeknd