【问题标题】:MS Access select .. into statement disorderedMS Access select .. into 语句无序
【发布时间】:2014-06-22 12:41:23
【问题描述】:

在一个 MS Access 2010 应用程序中,我使用以下 SQL 语句:

SELECT myTable.field1, myTable.field2, ... 
INTO temporaryTable
FROM myTable
ORDER BY myTable.field4, myTable.field3

temporaryTable 中记录的顺序往往不是按照ORDER 子句中定义的顺序,也不是temporaryTable 中的顺序。

一段时间以来,我尝试在 There and Back Again 中排序和复制表,以使订单清晰和固定,但这没有帮助。它也似乎是一个幻象,有时有效,有时无效。所以我必须编写一个透明但缓慢的 VBA 解决方法。

有人知道这件事吗?这是一个错误吗?最好的解决方法是什么?我错过了要设置的参数吗?

提前致谢:-)

【问题讨论】:

  • 订购餐桌有什么意义?没有什么意义,因为您总是可以在打开时订购它。请注意,在更高版本的 SQL Server 中,您可以在保存的视图中指定 order 子句。为什么不创建查询而不是临时表?
  • 无论您输入记录的顺序是什么,如果您在表上运行选择查询,则无法保证每次都会以相同的顺序返回记录。确保您必须无论如何都要指定 order by 子句。
  • @iDevlop:这是真的,但该表会立即用于导出到带有DoCmd.TransferSpreadsheet 的 Excel。虽然这个命令很强大,但从那以后我就遇到了订购问题。这就是为什么我将查询作为TransferSpreadsheet 的源(最舒适但排序问题)更改为临时表(仍然舒适且稳定)。表和TransferSpreadsheet命令之间现在没有问题,它们在查询和临时表之间的混乱。
  • @Swagata:我可以忍受这个。但我需要首先以正确的顺序创建使用SELECT ... INTO temporaryTable 创建的表。正如之前评论中提到的,我将表格提供给DoCmd.TransferSpreadsheet,所以它不在我的控制范围内。但是我了解到,一旦表格好了,导出到 Excel 就可以了。
  • 好吧,不确定这是否适合您,但可能您可以先创建表,然后尝试 INSERT INTO....SELECT..ORDER BY 查询

标签: sql ms-access-2010 jet-sql


【解决方案1】:

这类问题的标准回答是:

您永远不应依赖表中的行处于任何特定的“自然”顺序。对于大多数(如果不是全部)数据库都是如此,而不仅仅是 Access。换句话说,SELECT * FROM something(或等效项)没有 ORDER BY 子句意味着可以按 any 顺序返回行。事实上,如果您多次执行这样的语句,则每次调用可能不一定以相同的顺序返回行(尽管 Access 确实倾向于对此相当一致)。

如果您需要按特定顺序将记录导出到 Excel(如问题的 cmets 中所述),则应在 Access 中创建包含 ORDER BY 子句的已保存查询,然后将查询导出到 Excel。

【讨论】:

  • 我完全同意,谢谢。这将导致良好的编码和设计。但是Access强迫我确保一定的表记录顺序,我无能为力。早些时候,我看到查询在这里没有帮助。所以让我们逐行填写。至少在声明SELECT * INTO table FROM something ORDER BY fields 中,您会期望得到您订购的订单:-)
  • @peter_the_oak 请解释“Acc​​ess 强制我确保某个表记录顺序,我无能为力”是什么意思。正如我所说,如果您创建一个名为 [QueryForExcel] 的已保存查询,那么您可以使用DoCmd.TransferSpreadsheet 导出该查询(其中有一个 ORDER BY 子句来指定行顺序)。
  • 在我使用临时表来提供 DoCmd.TransferSpreadsheet 之前,我使用了保存的查询。几个月前。尽管我在查询中有明确的顺序,但在结果 Excel 的记录(或行)顺序错误的情况下。在我改为提供查询而不是表格后,Excel 中不再存在订单问题。这就是 Access 迫使我创建一个具有某种明确定义的行顺序的表的方式。
  • @peter_the_oak 有趣。我从未见过有序查询在导出到 Excel 时会打乱行顺序,但我会相信你的话。
  • 事实证明,使用 DELETE 和 INSERT,即使是逐行,您也无法保证订单被保留。目前实际上最好回到保存的查询,直到出现新的混乱问题。
【解决方案2】:

如果您确实需要临时表和特定订单,请尝试使用 DELETE + APPEND 查询而不是 MAKE TABLE 查询。在您的“不太临时”表中,您将能够定义主键和/或默认排序顺序。

【讨论】:

  • 这是一个很好的工作方法。由于是导出表,客户可能希望导出更多的字段。如果“not so temp”表没有准备好新字段,则 DELETE 和 APPEND 将不起作用。因此,我来​​删除表并在每次导出时创建新表。所以它是一个“不是真的但比通常的临时”表;-)
  • @iDevelop:事实证明,使用 DELETE 和 INSERT,即使是逐行,您也无法保证订单被保留。目前,只要我在那里没有遇到问题,我就必须使用保存的查询方式。
  • 您是否在非临时表中创建了 PK ?
  • @iDevelop:由于表格要立即导出到 Excel,PK 列会干扰结果。因此,如果我要添加它,我将不得不再次删除它。现在有那么一点,你的心告诉你真的不要再胡思乱想了^^所以你仍然可以带着美好的心情照镜子^^^^非常感谢你的努力。我现在已经解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多