Sql SELECT TOP 1 – Qaru
Изменено 5 лет, 3 месяца назад
Просмотрено 126 тысяч раз
20
Новинка! Сохраняйте вопросы или ответы и организуйте свой любимый контент.
Узнать больше.
Я получаю странные результаты из таблицы, из которой выбираю. Рассмотрим следующую таблицу:
USERID TICKETSASSIGNED 1 0 100 0 101 0 102 0 103 0
Теперь, если у меня есть следующий sql, как в:
SELECT TOP 1 USERID ИЗ ТАБЛЕКС ЗАКАЗАТЬ ПО БИЛЕТАМ
Я ожидаю получить результат «1», но чаще всего я получаю «100», вторую запись. Поскольку все значения TICKETSASSIGNED
равны «0», он случайным образом выбирает то, которое, по его мнению, является ТОП 1, поскольку это поле, в котором я заказываю. Чтобы получить правильное значение «1» в этом случае, мне также пришлось заказать
.
Есть идеи?
1
Я ожидаю получить результат «1», но чаще всего я получаю «100», вторую запись. Поскольку все значения TICKETSASSINGED равны «0», он случайным образом выбирает тот, который, по его мнению, является TOP 1, поскольку это поле, в котором я заказываю. Чтобы получить правильное значение «1» в этом случае, мне также пришлось заказать на USERID.
Это поведение по умолчанию во всех SQL — порядок не гарантируется, если нет предложения ORDER BY, и в этом случае вы не упорядочиваете соответствующие данные, поэтому база данных произвольно выбирает строку.
Использование:
ЗАКАЗ ПО БИЛЕТАМ, НАЗНАЧЕННЫМ, ID ПОЛЬЗОВАТЕЛЯ
В этом случае вам понадобится второй столбец в предложении ORDER BY
:
SELECT TOP 1 USERID ИЗ ТАБЛЕКС ЗАКАЗ ПО БИЛЕТАМ, НАЗНАЧЕННЫМ, ID ПОЛЬЗОВАТЕЛЯ
Без этого , вероятно, дает вам записи, упорядоченные по TICKETASSIGNED
, а затем по их физическому расположению в таблице, например. порядке, в котором они были вставлены в большинстве случаев.
Если вы проверите документацию для TOP
: TOP (Transact-SQL), особенно в первых двух абзацах в разделе «Примечания», прямо указано, что TOP не упорядочивает строки. Таким образом, используется тот порядок, который вы навязали сами себе.
К сожалению, ваш заказ неполный. Только иногда получается производить то, что вы хотите.
Правильный способ — именно то, что вы придумали, нужно заказывать еще и по USERID.
Если вы заказываете только по TICKETSASSIGNED
и все они имеют одинаковые значения, нет причин, по которым какая-либо конкретная запись должна быть возвращена в качестве верхней. Если вы хотите получить лучший, используя
в качестве следующего поля для заказа, тогда да, вы должны просто добавить USERID
в предложение заказа по.
1
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
sql server — Что означает TOP 1 в sql-запросе?
Спросил
Изменено 9лет, 8 месяцев назад
Просмотрено 22k раз
5
Новинка! Сохраняйте вопросы или ответы и организуйте свой любимый контент.
Узнать больше.
Что означает TOP 1 в запросе sql?
SELECT TOP 1 RequestId ОТ PublisherRequests
- SQL-сервер
1
Я не согласен с «Порядок будет определяться на основе кластеризованного ключа в этой таблице».
Электронная документация по SQL Server весьма ясна: Если в запросе нет предложения ORDER BY, порядок строк произвольный
репродукция, демонстрирующая, что это не всегда так: без ORDER BY порядок сортировки по умолчанию отсутствует.
1
Будет выбрана первая строка из таблицы PublisherRequests
.
РЕДАКТИРОВАТЬ: [Порядок будет определяться на основе кластеризованного ключа в этой таблице — это утверждение неверно]. На самом деле, по выводам Алекса и согласно BOL, порядок строк будет произвольным.
Справку можно найти здесь.
2
Запрос в примере вернет первый RequestID
из таблицы PublisherRequests
.