定义的字段过多
Posted
技术标签:
【中文标题】定义的字段过多【英文标题】:Too many fields defined 【发布时间】:2010-12-13 10:42:22 【问题描述】:我对 MS access 2007 有一个奇怪的问题。 如果我运行以下查询:
SELECT QUERY_LNK_ORDERS_ITEMS.*, QUERY_LNK_ERASALES_ERACOND.*
FROM QUERY_LNK_ORDERS_ITEMS
INNER JOIN QUERY_LNK_ERASALES_ERACOND
ON QUERY_LNK_ORDERS_ITEMS.concat = QUERY_LNK_ERASALES_ERACOND.concat
它可以工作,没有麻烦,然后我想用左/右连接包含丢失的记录,所以我运行:
SELECT QUERY_LNK_ORDERS_ITEMS.*, QUERY_LNK_ERASALES_ERACOND.*
FROM QUERY_LNK_ORDERS_ITEMS
INNER JOIN QUERY_LNK_ERASALES_ERACOND
ON QUERY_LNK_ORDERS_ITEMS.concat = QUERY_LNK_ERASALES_ERACOND.concat
UNION ALL
SELECT QUERY_LNK_ORDERS_ITEMS.*, QUERY_LNK_ERASALES_ERACOND.*
FROM QUERY_LNK_ORDERS_ITEMS
LEFT JOIN QUERY_LNK_ERASALES_ERACOND
ON QUERY_LNK_ORDERS_ITEMS.concat = QUERY_LNK_ERASALES_ERACOND.concat
WHERE QUERY_LNK_ORDERS_ITEMS.concat IS NULL
UNION ALL
SELECT QUERY_LNK_ORDERS_ITEMS.*, QUERY_LNK_ERASALES_ERACOND.*
FROM QUERY_LNK_ORDERS_ITEMS
RIGHT JOIN QUERY_LNK_ERASALES_ERACOND
ON QUERY_LNK_ORDERS_ITEMS.concat = QUERY_LNK_ERASALES_ERACOND.concat
WHERE QUERY_LNK_ERASALES_ERACOND.concat IS NULL
我得到:定义的字段太多
我不明白...我正在选择确切数量的字段,这个错误来自哪里?
提前致谢 干杯
【问题讨论】:
尝试使用明确的列列表... 嗨,米奇,问题是我有一个非常长的列表,哈哈事实上,如果我只尝试一两个字段,它可以工作,但如果我包含所有内容,则不会 不尊重 MS 或您自己,Access 不是一个功能齐全的数据库产品。它旨在供非技术用户简单使用,并且做得很好 - 但这些产品经常被用于它们不是为它们设计的东西。如果您尝试模拟完全连接(如下所述),那么您显然在技术上很复杂,您应该使用更好的数据库产品。我强烈建议您尝试其他可以更好、更轻松地完成这项工作的数据库。 嗨,鲍勃,完全没有冒犯的意思,你说的是正确和直接的。你唯一不知道的是,MS 访问是我项目中的业务需求,所以我不能使用另一个数据库,我必须坚持下去,而且……让它以某种方式工作:)。谢谢你的亮点;) @Bob Jarvis:虽然 Access 确实可供新手用户使用,但它也是一个强大的开发平台,非新手的开发人员可以做很多事情。 Jet/ACE 是数据库引擎,它确实有它的局限性(以及它自己的 SQL 方言),但这些在这里并不真正相关。在我看来,数据架构是一个糟糕的设计。 【参考方案1】:也许问题与您的JOINS无关,而与您的UNIONS有关!
我在 Google 上搜索了您的错误消息,发现:http://www.mvps.org/access/tables/tbl0002.htm。鉴于你有这么多领域......也许这就是问题所在?请注意,各种文章都讨论了 MS Access 的 INTERNAL 字段计数。也许各种 UNION ALL 子句受到内部字段计数的限制
【讨论】:
我尝试压缩表格...但它没有解决任何问题 “压缩”是什么意思?当您从两个表中选择 * 时,您会得到多少个字段? 我有 199 个字段。压缩是数据库中重置字段计数器的工具(因为如果你删除一列,例如它不会减少,所以压缩是一种从数据库中清除垃圾的方法) 任何需要 200 个字段的人都有架构错误。当然,我们有时都必须处理一些白痴创造的一堆废话,我们必须忍受,但这里的问题只是糟糕的设计。可能有也可能没有解决方法——很难说,因为没有列出实际要求。 @David-W-Fenton SAP(可能还有 Navision)有超过 255 列的表。现在我无法导出数据以访问和处理它,只是因为一些愚蠢的低限制。假设这两个是相当流行的财务软件,我会使用“经常”而不是“有时”。【参考方案2】:我不知道这是否有帮助,但我认为您不会从要求左连接列为空的左连接查询中获得任何结果,对于右连接查询也是如此,其中右连接列为空,这似乎是这里发生的事情。也许尝试切换左右连接?
【讨论】:
当我分别执行左/右连接时,我实际上得到了预期的结果 确实!刚刚得到确认... UNION 将我的选择视为 2 * 200... 所以 400 列... 这真的很愚蠢... 谢谢你们,我会尝试找出另一种解决此问题的方法.. .【参考方案3】:看看这个article。它很好地解释了所有不同的连接。
在您的情况下,您为什么不使用完整的外部联接?
SELECT QUERY_LNK_ORDERS_ITEMS.*, QUERY_LNK_ERASALES_ERACOND.*
FROM QUERY_LNK_ORDERS_ITEMS
FULL OUTER JOIN QUERY_LNK_ERASALES_ERACOND
ON QUERY_LNK_ORDERS_ITEMS.concat = QUERY_LNK_ERASALES_ERACOND.concat
【讨论】:
不幸的是,MS Access 没有 OUTER JOIN,而我在查询中做事的方式是如何模拟完整的外部连接 :)【参考方案4】:由于您发现问题出在 UNION 上(评论 Spiny Norman 的回答),我认为您唯一的选择是临时表(尽管您可能希望预先定义其结构,然后确保有效使用总是在重新填充之前清除它)。然后将每个查询作为插入运行(如果您不使用永久结构,则可能将第一个查询作为生成表),并从中进行选择以获得最终结果。
【讨论】:
【参考方案5】:您是否得到了答案,另一种方法可能是将这些分开并合并到一个记录集中。
Set rs = db.OpenRecordset(SQL1)
Set rs1 = db.OpenRecordset(SQL2)
Set rs2 = db.OpenRecordset(SQL3)
.......
【讨论】:
以上是关于定义的字段过多的主要内容,如果未能解决你的问题,请参考以下文章
查询在具有本地表的原始数据库中运行,但在表迁移到 SQL Server 时不运行 - 错误:“定义的字段过多”
SQL Server 在查询结果增加自定义的三个字段?如何搞?
如何通过多对多字段(精确匹配)中的对象过滤 django 模型?