ms-access:运行时错误3354

时间:2009-05-26 17:02:08

标签: sql ms-access

我在ms-access中运行sql时遇到问题。即时通讯使用此代码:

SELECT readings_miu_id, ReadDate, ReadTime, RSSI, Firmware, Active, OriginCol, ColID, Ownage, SiteID, PremID, prem_group1, prem_group2  
INTO analyzedCopy2  
FROM analyzedCopy AS A 
WHERE ReadTime =  (SELECT TOP 1 analyzedCopy.ReadTime FROM analyzedCopy  WHERE analyzedCopy.readings_miu_id = A.readings_miu_id  AND analyzedCopy.ReadDate = A.ReadDate  ORDER BY analyzedCopy.readings_miu_id, analyzedCopy.ReadDate, analyzedCopy.ReadTime)
ORDER BY A.readings_miu_id, A.ReadDate ; 

在此之前,我在给定某些标准的其他表中填写analyzeCopy表。对于一组标准,这段代码工作正常,但对于其他人,它一直给我运行时错误'3354'。我能看到的唯一不同之处在于,根据可行的标准,该表大约有4145条记录长,而使用此代码的表格不起作用的条件长度超过9000条记录。有什么建议吗?

有没有办法告诉它只拉出一半的信息,然后在表格的另一半上运行相同的选择字符串,并将这些结果添加到上半年的前一个结果中?

运行时错误“3354”的全文是“此子查询最多可以返回一条记录。”

我只是尝试在前4000条记录上运行此查询,并且使用相同的错误代码再次失败,因此它不能是我想到的记录数量。

3 个答案:

答案 0 :(得分:5)

见:

http://allenbrowne.com/subquery-02.html#AtMostOneRecord

发生的事情是你的子查询返回两个相同的记录(基于ORDER BY),TOP 1实际上返回两个记录(是的,这是TOP语句的访问方式)。你需要在ORDER BY中添加字段以使其唯一 - 最好是一个唯一的ID(你确实有一个独特的PK吗?)

正如Andomar所述,DISTINCT TOP 1也将起作用。

答案 1 :(得分:2)

运行子查询时MS-ACCESS会返回什么?

SELECT TOP 1 analyzedCopy.ReadTime 
FROM analyzedCopy
WHERE analyzedCopy.readings_miu_id = A.readings_miu_id  
AND analyzedCopy.ReadDate = A.ReadDate  
ORDER BY analyzedCopy.readings_miu_id, analyzedCopy.ReadDate, 
         analyzedCopy.ReadTime

如果它返回多行,也许可以用DISTINCT修复:

SELECT DISTINCT TOP 1 analyzedCopy.ReadTime 
FROM ... rest of query ...

答案 2 :(得分:0)

我不知道这是否会起作用(而且我不再拥有Access的副本进行测试),所以如果我离开的话,我会在前面道歉。

首先,只需对analyzeCopy的主键进行选择即可获得中点ID。类似的东西:

SELECT TOP 4500 readings_miu_id FROM analyzedCopy ORDER BY readings_miu_id, ReadDate;

然后,当您拥有中点ID时,可以将其添加到原始语句的WHERE语句中:

SELECT ...
INTO ...
FROM ...
WHERE ... AND (readings_miu_id <= {ID from above}
ORDER BY ...

然后选择另一半:

SELECT ...
INTO ...
FROM ...
WHERE ... AND (readings_miu_id > {ID from above}
ORDER BY ...

再次,抱歉,如果我离开了。