在Access中的多个列上加入两个大表

时间:2018-01-23 15:30:30

标签: sql ms-access join

我有两张桌子:

  1. 约300,000行以及以下字段的交易:

    • 的TransactionID
    • 客户端ID
    • Q
    • ý
    • 类型
  2. 大约10,000行的价格,以及以下字段:

    • 客户端ID
    • Q
    • ý
    • 类型
    • 价格
  3. 我尝试使用4个字段加入它们:ClientID, Q, Y, Type,但我总是得到2GB错误,说结果表太大了。事情是结果应该是300,000行,所以我的猜测是Access以一些愚蠢的方式做到了,首先创建笛卡尔积并抛出错误。有趣的是,如果我只使用ClientID加入它就可以正常工作,并且可以提供数百万行。

    有人可以帮我找到合适的出路吗?也许我只需要了解如何在幕后执行连接,但到目前为止我还没有找到任何有意义的内容。

    我考虑添加 hash 列,它会在两个表中连接4个列并使用它来加入,但是这个丑陋的解决方案我只是畏缩。

    我当前的SQL就像

    SELECT TransactionID, Price 
    FROM Transactions 
    INNER JOIN Prices
       ON Transactions.ClientID = Prices.ClientID 
      AND Transactions.Q = Prices.Q 
      AND Transactions.Y = Prices.Y 
      AND Transactions.Type = Prices.Type
    

2 个答案:

答案 0 :(得分:1)

尝试使用派生表强制执行不同的查询:

SELECT TransactionID, Price FROM 
(SELECT TransactionID, Price, Transactions.Q as TransQ, Prices.Q as PricesQ,
Transactions.Y as TransY, Prices.Y as PricesY, Transactions.Type as
TransType, Prices.Type as PricesType
FROM Transactions INNER JOIN Prices
ON Transactions.ClientID = Prices.ClientID) AS Step1
WHERE TransQ = PricesQ AND TransY = PricesY
AND TransType = PricesType

答案 1 :(得分:1)

根据Access 2016 specifications,大小限制定义为:

  

2千兆字节,减去系统对象所需的空间。

处理此查询时的虚拟表可能是个问题。要在查询窗口中显示SELECT语句结果,需要将数据临时存储在系统对象中。如果原始文件已经很大,那么JOIN查询中相同表的连接(即复制)将会更大。

根据上述相同规范的建议,请考虑将价格迁移到其他.accdb / .mdb文件并使用链接表(Access to Access)进行查询。如果您保留相同的表名,原始查询将不需要更改!或者,在外部查询,如下所示。这样,您可以将处理临时表大小与存储大小分开,以适应2GB配额。

SELECT t.TransactionID, Price 
FROM Transactions t
INNER JOIN [C:\Path\To\Other\Database.accdb].[Prices] p
   ON t.ClientID = p.ClientID 
  AND t.Q = p.Q 
  AND t.Y = p.Y 
  AND t.Type = p.Type

即便如此,将两个表存储在不同的文件中,并使用不同的无数据Access应用程序来运行查询。实际上,理想情况下,这是使用Access开发推荐的拆分体系结构,其中带有表的存储(BackEnd)与应用程序(FrontEnd)与查询/表单/报告/宏/模块分开。

Split Architecture