我在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条记录上运行此查询,并且使用相同的错误代码再次失败,因此它不能是我想到的记录数量。
答案 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 ...
再次,抱歉,如果我离开了。