Select top 1 sql: TOP (Transact-SQL) — SQL Server

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» в этом случае, мне также пришлось заказать

USERID .

Есть идеи?

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 в качестве следующего поля для заказа, тогда да, вы должны просто добавить 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 .

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *