Sql 定义的字段太多

Sql 定义的字段太多,sql,ms-access,ms-access-2007,join,Sql,Ms Access,Ms Access 2007,Join,我对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 它工作正常,没有问题,然后我想

我对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
我得到:定义的字段太多了

我不明白。。。我正在选择字段的确切数量,这个错误是从哪里来的

提前谢谢
干杯

我不知道这是否有帮助,但我认为,如果左连接查询要求左连接列为null,则不会得到任何结果,对于右连接查询也是如此,其中右连接列为null,这似乎就是这里发生的情况。也许可以尝试切换左右连接?

看看这个。它很好地解释了所有不同的连接

在您的情况下,为什么不使用完全外部联接

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的内部字段计数。可能各种UNION ALL子句受到内部字段计数的限制,因为您发现问题在于UNION(对Spiny Norman的答案进行评论),我认为您唯一的选择是临时表(虽然您可能希望先定义其结构,然后确保在重新填充之前始终清除有效的使用)。然后将每个查询作为插入运行(如果不使用永久结构,可能将第一个查询作为生成表运行),并从中进行选择以获得最终结果。

您是否得到了答案?另一种方法可能在于将这些分离并合并到记录集中

Set rs = db.OpenRecordset(SQL1)
Set rs1 = db.OpenRecordset(SQL2)
Set rs2 = db.OpenRecordset(SQL3)
 .......

尝试使用一个显式的列列表…嗨,米奇,问题是我有一个非常长的列表lol事实上,如果我只尝试使用一个或两个字段,它是有效的,但如果我没有不尊重MS或你自己包括所有内容,Access并不是一个功能齐全的数据库产品。它是为非技术用户简单使用而设计的,并且做得很好-但这类产品往往被用于它们不是为之设计的东西。如果您试图模拟完全连接(如下所述)很明显,你的技术很成熟,你应该使用更好的数据库产品。我强烈建议你尝试另一种数据库,它可以更好、更简单地完成这项工作。嗨,鲍勃,一点也不冒犯,你说的是对的和直截了当的。你唯一不知道的是,MS access是我项目中的一项业务需求,所以我不能使用另一个数据库,我必须坚持使用它,好吧……让它以某种方式工作:)。谢谢你的精彩表演;)@Bob Jarvis:虽然Access确实可以被新手用户使用,但它也是一个强大的开发平台,非新手的开发人员可以利用它做很多事情。Jet/ACE是数据库引擎,它确实有它的局限性(以及它自己的SQL方言),但这些在这里并不真正相关。在我看来,数据模式是一个糟糕的设计。当我单独执行左/右连接时,我实际上得到了预期的结果!刚刚得到确认。。。工会认为我的选择是2*200。。。所以400列。。。这真是个蠢货。。。谢谢你们,伙计们,我要想办法解决这个问题…我试着把桌子压实。。。但是它没有解决任何问题,“压缩”是什么意思?当你从两个表中选择*时,你会得到多少字段?我有199个字段。压缩是数据库中重置字段计数器的工具(例如,如果删除一列,它不会减少,因此压缩是从数据库中清除rabbish的一种方法),任何需要200个字段的人都会出现模式错误。当然,我们有时都不得不处理一些白痴创造的垃圾,我们不得不忍受,但这里的问题只是糟糕的设计。可能有,也可能没有解决办法——很难说,因为实际需求没有列出。@David-W-Fenton SAP(Navision可能也有)的表超过255列。现在我无法导出数据来访问和处理它,因为一些愚蠢的低限制。假设这两个是相当流行的金融软件,我会使用单词“经常”而不是“有时”。不幸的是,MS Access没有外部连接,我在查询中的做法是如何模拟完全外部连接:)