组合大量表和字段的正确方法是啥?

Posted

技术标签:

【中文标题】组合大量表和字段的正确方法是啥?【英文标题】:What is the correct approach to combining large numbers of tables and fields?组合大量表和字段的正确方法是什么? 【发布时间】:2013-06-03 15:36:34 【问题描述】:

我需要选择 n 表中的所有行,其中 n > 15 in ms 访问数据集。单个查询导致错误“定义的字段过多”。我的猜测是它超过了 255 个字段的限制。

SELECT * FROM ((((((((((((((((Forms 
LEFT JOIN Layouts ON Layouts.Name = Forms.Name) 
LEFT JOIN Layout ON Layout.Name = Forms.Name) 
LEFT JOIN Form ON Form.Name = Forms.Name) 
LEFT JOIN Sections ON Sections.ID] = Form.ID) 
LEFT JOIN Checks ON Checks.ID = Form.ID) 
LEFT JOIN Dates ON Dates.ID = Form.ID) 
LEFT JOIN Combos ON Combos.ID = Form.ID) 
LEFT JOIN Labels ON Labels.ID = Form.ID) 
LEFT JOIN Flash ON Flash.ID = Form.ID) 
LEFT JOIN Links ON Links.ID = Form.ID) 
LEFT JOIN Groups ON Groups.ID = Form.ID) 
LEFT JOIN Lists ON Lists.ID = Form.ID) 
LEFT JOIN Pictures ON Pictures.ID = Form.ID) 
LEFT JOIN Grids ON Grids.ID = Form.ID) 
LEFT JOIN Shapes ON Shapes.ID = Form.ID) 
LEFT JOIN Texts ON Texts.ID = Form.ID) 
WHERE Forms.Name = 'History'

我从一些 SO 用户那里了解到,这种访问大量列/字段的方法是不合适或不好的做法。在许多表都相关的情况下,获取大量字段的正确方法或思维方式是什么?

【问题讨论】:

哇!这才是真正的明星! 【参考方案1】:

您的查询中的问题是select *,而不是连接。如果Form.Id 确实是您想要加入的字段,那么这些联接可能就很好了。

相反,列出选择中的列:

SELECT col1, col2, col3 . . .
FROM ((((((((((((((((Forms 
LEFT JOIN Layouts ON Layouts.Name = Forms.Name) 
LEFT JOIN Layout ON Layout.Name = Forms.Name) 
LEFT JOIN Form ON Form.Name = Forms.Name) 
LEFT JOIN Sections ON Sections.ID] = Form.ID) 
LEFT JOIN Checks ON Checks.ID = Form.ID) 
LEFT JOIN Dates ON Dates.ID = Form.ID) 
LEFT JOIN Combos ON Combos.ID = Form.ID) 
LEFT JOIN Labels ON Labels.ID = Form.ID) 
LEFT JOIN Flash ON Flash.ID = Form.ID) 
LEFT JOIN Links ON Links.ID = Form.ID) 
LEFT JOIN Groups ON Groups.ID = Form.ID) 
LEFT JOIN Lists ON Lists.ID = Form.ID) 
LEFT JOIN Pictures ON Pictures.ID = Form.ID) 
LEFT JOIN Grids ON Grids.ID = Form.ID) 
LEFT JOIN Shapes ON Shapes.ID = Form.ID) 
LEFT JOIN Texts ON Texts.ID = Form.ID) 
WHERE Forms.Name = 'History'

【讨论】:

感谢您的回复,我需要表中的所有字段,在这种情况下,我是否仍应列出查询中的所有列? (在某些情况下某些表是空的) SELECT * 给你一个错误并且在这里通常不合适的原因:它从被连接的 All 表中返回 All 列。如果您想从特定表中选择所有列(这也不太好),请使用SELECT Layout.*, Grids.*。记得在上面提到的所有列上创建索引。 @ErnestSoeralaya 。 . .如果您需要超过 255 列,那么您就有问题了。您还有一个次要问题是许多列名重复(例如id),但这似乎不是问题。 @ErnestSoeralaya,MS Access 对单个查询中返回的列数有限制——这就是错误的原因。如果您确实需要所有列,那么有一个主查询,以便可以从中识别每一行:为每一行组成一个“主”键。然后有几个查询按所有关键列排序以提取最终表的不同部分。最后将它们并排放置在 Excel 中,因为 Access 对列数有限制。我自己不喜欢这个解决方案,但想不出任何其他方式,除非您可以更改要求,例如询问“用户接下来用它做什么”? 在我的原始程序中,我将每个表插入到数据集中,每个表都有自己的单独查询。我认为如果我可以将所有内容组合到一个查询中会更快。 @GordonLinoff 在此类需要超过 255 列的情况下,将许多表导入数据集时,是否应将其拆分为单独的查询?

以上是关于组合大量表和字段的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular 中组合可观察数据的正确方法是啥?

为组合类创建 DAO 类的正确方法是啥

使用通用虚函数实现的任意组合实现派生类的正确方法是啥?

在graphql中,组合多个源中的字段共享一个共同值的多个源的最佳方法是啥?

加入组合框的 ID

主键约束是啥和啥组合?