使用MS-Access,我试图选择不在表的前5个结果中的所有行。例如,使用TableName:
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
显然这不是那么简单,但我不知道如何解决它。有什么想法吗?
答案 0 :(得分: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
(如果Access允许子查询中的订单,我会忘记,因此您可能必须将其保存为单独的查询对象)
或者,WHERE NOT EXISTS
条件:
SELECT *
FROM YourTable
WHERE NOT EXISTS (
SELECT TOP 5 FROM YourTable ORDER BY Whatever
)
但是,我不确定Access是否允许子查询中的订单,所以如果你必须保存一个查询:
SELECT TOP 5 IDField FROM YourTable ORDER BY Whatever
...假装它叫做CriteriaQuery,然后在另一个查询中引用该查询:
SELECT *
FROM YourTable
WHERE NOT EXISTS (
SELECT * FROM CriteriaQuery
)
(沮丧的联接与不存在的联系的性能差异将取决于数据...通常我首先使用受挫的加入,对于Access,并根据需要进行微调)
答案 1 :(得分: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
的{{1}}部分会被忽略,因此永远不会处理EXISTS
(花了一些时间来弄清楚这一点)
TOP
答案 2 :(得分:0)
SELECT * FROM table WHERE table.ID NOT IN (
SELECT TOP 5 table.ID FROM table
ORDER BY table.ID
)