繁体   English   中英

选择不在前5名中的行

[英]Selecting Rows that are NOT in the Top 5

使用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

显然这不是那么简单,但我不知道如何解决它。 有任何想法吗?

你可以做一个前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,并在需要时进行微调)

您也可以使用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)
SELECT * FROM table WHERE table.ID NOT IN (

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

)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM