访问生成表查询
Posted
技术标签:
【中文标题】访问生成表查询【英文标题】:Access Make Table Query 【发布时间】:2015-03-11 16:13:54 【问题描述】:我在运行生成表查询时遇到了一些问题。该查询可以作为选择查询正常工作,返回包含我需要的所有列的数据表。但是,当我尝试将它作为 Make Table 查询运行时,它会卡住(几个小时没有进展)。
有没有一种方法可以在不使用“生成表”查询的情况下使用选择查询的结果创建表?数据集大约有 350,000 条记录。 Make Table 查询使用了一个包含大约 30,000 条记录的测试数据库。使用 350,000 条记录数据库的子集 (30,000) 运行 Make Table 查询也不起作用。
【问题讨论】:
经过一番研究,我遇到了support.microsoft.com/kb/178650。虽然我认为这不一定是您的问题的解决方案,但它确实表明它可能是导致问题的查询的复杂性。我假设即使您将查询限制为 30k,查询仍然同样复杂,并且可能是它仍然失败的原因。虽然这只是一个猜测。 我也遇到了一些非常慢的查询。我通常在一夜之间运行它们。您可以尝试将其复制并粘贴到新表中。我在想也许你可以尝试一个 VBA 解决方案,它可以从你的查询中创建一个表,但我没有尝试过。 【参考方案1】:可能发生的是内存和磁盘资源限制。对 N=350,000 条记录的 Make-Table 查询正在扩展数据库并将现有数据的大小翻倍(即,除了其派生数据)。请记住,行数并不是影响大小的唯一因素:表的宽度(最多 255 个)和数据类型(双精度与整数、备忘录与文本字段等)也会影响数据库大小。正如SO post 所示,您可以拥有一个包含 700 万条记录的四列整数表,小于 200 MB!
另外,与普通的 Select 查询相比,Make-Table 查询运行相同的完整或选择表扫描多次,具体取决于连接数(想想记录上的笛卡尔积)加上它扩展以创建新的数据库对象,即带有所有定义的表。此过程很容易膨胀并达到 Access 的 2GB 限制或接近该限制,从而减慢处理速度。如果您停留的时间足够长,则可能会出现错误消息:临时磁盘空间不足。 (错误 3183) 可能会出现。
考虑将 Make Table 传递到一个外部的、空的或更小的 Access 数据库中,然后该数据库的表可以链接到当前数据库:
SELECT * INTO [NewTable]
IN 'C:\Path\To\ExternalDatabase.accdb'
FROM [QueryName]
使用自动 VBA 表链接:
DoCmd.TransferDatabase acLink, "Microsoft Access", _
"C:\Path\To\ExternalDatabase.accdb", acTable, _
"SrcTableName", "DestTableName"
或者,链接一个预先存在的外部、空/较小的 Access 表并在当前数据库中运行附加查询:
INSERT INTO [LinkedTabe] SELECT * FROM [QueryName]
【讨论】:
以上是关于访问生成表查询的主要内容,如果未能解决你的问题,请参考以下文章