MS Access中SQL查询的奇数结果
好的,这里有一个来自我正在运行的MS Access数据库的奇数 我有一个SQL查询:MS Access中SQL查询的奇数结果,sql,ms-access,Sql,Ms Access,好的,这里有一个来自我正在运行的MS Access数据库的奇数 我有一个SQL查询: SELECT * FROM [Service Schedule] WHERE ID=2 AND Volume <= 3000 AND Term='Monthly' AND special = 'Regular' ORDER BY volume 选择* 从[服务时间表] 其中ID=2 音量我不确定你对该表的PK值做了什么,但当你说:“ID=2”时,我听起来很可疑,因为我总是使用代理键(从
SELECT *
FROM [Service Schedule]
WHERE ID=2
AND Volume <= 3000
AND Term='Monthly'
AND special = 'Regular'
ORDER BY volume
选择*
从[服务时间表]
其中ID=2
音量我不确定你对该表的PK值做了什么,但当你说:“ID=2”时,我听起来很可疑,因为我总是使用代理键(从不自然),ID总是PK。由于您没有加入任何表,这告诉我您应该始终期望从结果中得到一行/元组
如果ID不是你的PK,你介意通过评论让我知道吗
也许您需要使用以下命令迭代结果集:
Set.MoveNext我不确定您对该表的PK值做了什么,但当您说:“ID=2”时,我听起来很可疑,因为我总是使用代理键(从不使用自然键),而ID总是PK。由于您没有加入任何表,这告诉我您应该始终期望从结果中得到一行/元组
如果ID不是你的PK,你介意通过评论让我知道吗
也许您需要使用以下命令迭代结果集:
Set.MoveNext听起来您希望“看到”所有记录,但我认为您只是在检索第一条记录。我这样说是因为你看到了每个病例的第一个记录。您可能需要移动到记录集中的下一条记录才能看到下一条记录
rsServiceSched.MoveNext
听起来您希望“看到”所有记录,但我认为您只是在检索第一条记录。我这样说是因为你看到了每个病例的第一个记录。您可能需要移动到记录集中的下一条记录才能看到下一条记录
rsServiceSched.MoveNext
您可能没有遍历结果集。
rsServiceSched只是指向第一条记录,它将是卷数最低的记录(根据您的orderby子句)。现在你需要做点什么,然后进入下一个记录
可能会帮助您…您可能没有在结果集中循环。
rsServiceSched只是指向第一条记录,它将是卷数最低的记录(根据您的orderby子句)。现在你需要做点什么,然后进入下一个记录
可能会帮助您……离题:DAO记录集记录计数的讨论
DAO记录集的recordcount在.MoveLast之后才能保证准确,但如果记录集返回任何记录,.recordcount将为1或更多
请注意,表类型记录集将立即返回准确的.RecordCount,而不返回.MoveLast,但请记住,不能在链接表上打开表类型记录集。另外,要小心,不要假设您得到了想要的记录集类型,除非您明确指定了它。虽然dbOpenTable是默认的记录集类型,但如果无法将表或SQL字符串作为表类型记录集打开,则它将转而打开动态集。因此,您可以认为您正在使用以下内容打开一个表类型记录集,因为表类型是默认的,并且您已经传递了一个表名:
Set rs = CurrentDB.OpenRecordset("MyTable")
但是您必须记住,仅仅因为您向它传递了一个表,它就不一定会打开一个表类型的记录集,并且记录计数也不一定准确。如果确实要确保打开的是表类型记录集,则需要明确指定:
Set rs = CurrentDB.OpenRecordset("MyTable", dbOpenTable)
如果“MyTable”是链接表,则会抛出错误。如果混合使用链接表和本地表,则必须使用两种不同的方法来获取表类型记录集。否则(即,如果您没有指定记录集类型,并在可能的情况下将其设置为表类型,在可能的情况下将其设置为动态集),则需要知道何时需要.MoveLast以获得准确的.RecordCount。如果您真的想在这种情况下提高效率,您将测试记录集的.Type:
Set rs = CurrentDB.OpenRecordset("MyTable")
If rs.Type = dbOpenDynaset Then
rs.MoveLast
End If
此时,无论记录集是作为表类型还是作为动态集打开,您都将拥有一个准确的.RecordCount属性
但是请记住,很少需要使用完整的记录集来获取记录计数。通常,您只需要检查.RecordCount来查看您的记录集是否返回了任何记录,在这种情况下,您不需要准确的计数
同样,如果要遍历完整的记录集,最终将获得准确的记录计数。也就是说,这样做是毫无意义的:
Set rs = CurrentDB.OpenRecordset("MyTable")
rs.MoveLast
If rs.RecordCount > 0 Then
.MoveFirst
Do Until rs.EOF
[something or other]
.MoveNext
Loop
End If
Debug.Print rs.RecordCount
在该上下文中完全不需要.MoveLast,因为您不需要知道代码中该点的确切计数
另外,请记住,在某些确实需要知道确切的.RecordCount的上下文中,只使用内置的Access DCount()函数或执行类似操作可能更有效:
Dim lngRecordCount As Long
lngRecordCount = CurrentDB.OpenRecordset("SELECT COUNT(*) FROM MyTable")(0)
或:
在不强制记录集指针移动到最后一条记录的情况下,有各种有效的快捷方式来获取准确的记录计数
顺便说一句,纯表类型记录的RecordCount之所以准确,原因之一是它不需要计算——Jet/ACE将RecordCount属性作为其常规操作的一部分进行维护
题外话:ADO记录集记录计数的讨论
由@onedaywhen
对于ADO记录集,RecordCount
属性将始终是最终值。也就是说,与DAO不同,如果您检查它的值,它就不能随后更改。导航EOF
不会以任何方式影响ADO的RecordCount
值
即使异步获取记录时也是如此(DAO记录集不明确支持这一点):也就是说,即使记录集尚未满,RecordCount
属性仍然反映最终值(与DAO相比,不是到目前为止获取的记录数)
CursorLocation
和CursorType
的某些组合将导致RecordCount
始终为-1,这意味着不支持该属性。但是
lngRecordCount = DBEngine.OpenDatabase(Mid(CurrentDB.TableDefs("MyTable").Connect, 11)).TableDefs("MyTable").RecordCount