2016-08-25 3 views
1

Используя MS-Access, я пытаюсь выбрать все строки, которые НЕ входят в пятерку лучших результатов таблицы. Например, TableName:Выбор строк, которые НЕ входят в верхние 5

Col1|Col2 
1 |A 
2 |B 
3 |C 
4 |D 
5 |E 
6 |F 
7 |G 

Я хотел бы выполнить псевдо-запрос:

SELECT NOT TOP 5 Col1, Col2 FROM TableName ORDER BY Col1 ASC; 

с ожидаемым результатом множества

Col1|Col2 
6 |F 
7 |G 

Очевидно, что это не так просто, но Я не знаю, как его решить. Есть идеи?

+2

Как вам define 'TOP 5' –

+1

Может ли быть так же просто, как сортировка по убыванию? – WillardSolutions

+0

Я отредактировал, чтобы добавить оператор ORDER BY в запрос. К сожалению, нисходящий сортировка не будет работать, поскольку я не всегда знаю, сколько строк будет указано за пределами этих верхних 5. Я просто знаю, что что-то большее, чем первые 5 столбцов, будет проблемой, которая должна быть решена. И нет, Col1 не является ключевым или идентификационным номером, просто представителем заказа, возвращенного набором записей. – SandPiper

ответ

3

Вы можете сделать подзапрос в верхней части 5, затем расстроенное соединение, чтобы захватить все записи не в них. Что-то вроде этого:

SELECT * 
FROM YourTable AS a 
LEFT JOIN (
    SELECT TOP 5 ID FROM YourTable ORDER BY Whatever 
) AS b ON a.ID = b.ID 
WHERE b.ID IS NULL 

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

В качестве альтернативы, WHERE NOT EXISTS критерии:

SELECT * 
FROM YourTable 
WHERE NOT EXISTS (
    SELECT TOP 5 FROM YourTable ORDER BY Whatever 
) 

Снова, хотя, я не уверен, если доступ позволяет заказ в подзапрос, поэтому если у вас есть, чтобы сохранить один запрос:

SELECT TOP 5 IDField FROM YourTable ORDER BY Whatever 

... вид, что называется CriteriaQuery, затем ссылаться на этот запрос в другой запрос:

SELECT * 
FROM YourTable 
WHERE NOT EXISTS (
    SELECT * FROM CriteriaQuery 
) 

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

+0

Доступ даст вам все совпадающие вершины 5, которые могут быть более 5 результатов. Вы можете обойти это по роду любым уникальным полем/столбцом. – Fionnuala

+0

@Fionnuala - хороший момент, я думал, что это был строго уникальный идентификатор, но ваша точка взята. – jleach

0

Вы также можете использовать NOT IN

select * 
from Table1 as To 
where To.ID not in (
    Select top 5 Ti.id 
    from Table1 as Ti 
    order by Ti.ID) 

Или NOT EXISTS

SELECT * 
FROM Table1 AS [To] 
WHERE not Exists (select * from (Select top 5 * 
    from Table1 order by ID)as Ti 
    where To.ID = Ti.ID 
    ) 

Однако эта версия NOT EXISTS не будет работать, потому что SELECT часть EXISTS игнорируется, так что TOP никогда не обрабатывается (мне потребовалось некоторое время, чтобы понять это)

SELECT * 
FROM Table1 AS [To] 
WHERE not Exists (Select top 5 * 
    from Table1 as Ti 
    where To.ID = Ti.ID 
    order by Ti.ID) 
0
SELECT * FROM table WHERE table.ID NOT IN (

SELECT TOP 5 table.ID FROM table 
ORDER BY table.ID 

) 
Смежные вопросы