У меня очень-очень простая строка SQL, которая, похоже, не нравится MS Access.
Select Top 5 * From news_table Order By news_date
Это возвращает ВСЕ строки из news_table, а не только первые 5.
Я думал, что это простой оператор SQL, но, видимо, это не так.
Какие-нибудь исправления или идеи относительно того, почему это не работает? Спасибо!


Пытаться
Select Top 5 From news_table Order By news_date
Select Top n выбирает все записи, в которых записи равны, то есть, если вы выбираете Top 2 и у вас есть 20 date1 и 20 date2, будет выбрано 40 записей.
Если есть ключевое поле,
Select Top 5 * Order By KeyField
Должно возвращать 5 записей, потому что ключевое поле уникально.
Так как я мог ограничить его только двумя? Я также пытался сделать Select * From news_table order by news_table Limit 2, и это не сработало.
У вас есть ключевое поле? Если вы выберете верхние 2 порядка по ключевому полю, вы получите 2, потому что ключ уникален.
Единственная проблема с этим в том, что у них есть возможность изменить дату, поэтому я не всегда хочу, чтобы идентификатор 14 был ниже идентификатора 15.
Я не слишком знаком с внутренними данными Access, но в SQL Server SELECT TOP X будет возвращать только X строк. Он будет возвращать связи, только если вы укажете это с помощью SELECT TOP X WITH TIES. Я не уверен, что Access такой же.
Jet SQL (у Access нет собственного SQL) не поддерживает WITH TIES - TOP N всегда возвращает связи (office.microsoft.com/en-us/access/HP010322051033.aspx).
@pixeldev, если вы 'order by news_date, id', он будет правильно упорядочивать по дате, если дата будет изменена, но если позиции 5 и 6 имеют одинаковую дату, вы получите только запись с более низким идентификатором (или вы можете сделать 'id desc', если вам нужен более высокий идентификатор в этом сценарии)
Как сказал Дэвид, «TOP N всегда возвращает ничьи». Это также вызывает другую проблему. Если у вас есть ключ с несколькими столбцами, TOP X вернет все между всеми ключевыми полями, которые имеют связи.
Я обнаружил, что добавление столбцов в порядок сортировки, чтобы каждый элемент сортировки был уникальным, решает проблему с TOP N, вызванную WITH TIES.
Это помогает?
select top 5 *
from (select * from news_table order by news_date)
Не знаю, почему оригинал не работает. Может, это причуда с Access.
Обновлено: бизнес-правила не указаны. Я не совсем понимал, что цель состояла в том, чтобы занять первое место в таблице и получить 5 лучших дат. Можно было получить первые 5 записей и затем оценить их.
Я не могу воспроизвести вашу проблему в своей версии Access. Странный.
Это работает, но ваш код перевернут. Сначала мы хотим сделать выбор с помощью Порядка, чтобы получить правильный Порядок, затем выберите 5 лучших. Если вы воспользуетесь своим кодом, мы сначала выберем 5 лучших, а затем отсортируем их по news_date. Но это помогло. Спасибо!
В прошлом у меня были проблемы с подобными заявлениями в Access. Чтобы отладить похожие проблемы, я всегда разбиваю запрос на несколько запросов. Я бы предложил создать запрос в доступе, который выполняет выбор с помощью оператора order by. Затем выполните выборку из этого запроса.
Query1 => SELECT * FROM news_table Упорядочить по news_date;
Query2 => Выбрать 5 лучших из Query1;
Я считаю, что в данном случае это не обязательно и не очень полезно.
Я почти никогда не пишу SQL на *. Мне интересно, возможно, Jet SQL не разбирает это правильно. Попытался ли ты:
SELECT TOP 5 news_table.* FROM news_table ORDER BY news_date
Я бы всегда так писал.
Да, SELECT TOP 5 * должен работать, но если это не так, возможно, поможет немного больше конкретики.
он забыл селектор (*) :) но в итоге будет предоставлен код