Sql 连接Access中多列上的两个大表

Sql 连接Access中多列上的两个大表,sql,ms-access,join,Sql,Ms Access,Join,我有两张桌子: 具有大约300000行和以下字段的事务: 事务ID 客户 Q Y 类型 大约10000行的价格,以及以下字段: 客户 Q Y 类型 价格 我尝试使用4个字段将它们连接起来:ClientID、Q、Y、Type,但我总是收到2GB的错误,说结果表太大了。问题是结果应该是300000行,所以我猜Access用了一些愚蠢的方法,首先创建笛卡尔积,然后抛出一个错误。有趣的是,如果我只使用ClientID来加入它,效果会很好,并给出数百万行 有人能帮我找到正确的出路吗?也许我只需要学

我有两张桌子:

  • 具有大约300000行和以下字段的事务:

    • 事务ID
    • 客户
    • Q
    • Y
    • 类型
  • 大约10000行的价格,以及以下字段:

    • 客户
    • Q
    • Y
    • 类型
    • 价格
  • 我尝试使用4个字段将它们连接起来:
    ClientID、Q、Y、Type
    ,但我总是收到2GB的错误,说结果表太大了。问题是结果应该是300000行,所以我猜Access用了一些愚蠢的方法,首先创建笛卡尔积,然后抛出一个错误。有趣的是,如果我只使用
    ClientID
    来加入它,效果会很好,并给出数百万行

    有人能帮我找到正确的出路吗?也许我只需要学习如何在幕后执行联接,但到目前为止我还没有发现任何有意义的东西

    我考虑添加哈希列,它将在两个表中连接4个列并使用它来连接,但它是如此丑陋的解决方案,我只是畏缩。< /P> 我当前的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
    

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

    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
    
    根据,尺寸限制定义为:

    2 GB,减去系统对象所需的空间

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

    由以上相同规格推荐,考虑将价格迁移到不同的.ACDB/.MDB文件和使用链接表的查询(访问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开发推荐的理想分割体系结构,其中带有表的存储(后端)与带有查询/表单/报表/宏/模块的应用程序(前端)分离


    只有这两个表的数据库的当前大小是多少?加入数据库之前是否压缩了数据库?是否在clientId上有适当的索引?@PatrickHonorez我没有,但最终目标是动态生成这些表,因此我认为这不是一个解决方案。这个想法很好,但Access显然希望比我更聪明,仍然会抛出错误。然而,你和@Parfait的想法导致了我将使用的变通方法。我将把联接的结果放在临时数据库中的ClientID上,然后只选择那些与Q、Y和类型匹配的结果。@brainac。。。好奇的是,将数据表.accdb文件与query app.accdb文件链接的结果是什么?您在后者的文件中对前者的链接表运行原始查询?@Parfait不确定我是否理解您的问题,但最终我将大约1100万条记录的结果表放在临时数据库中,只需在查询中使用[;database=],然后,我删除了不匹配Qs、Ys和类型的行。剩余的300k行很容易与用于存储结果的表连接起来。它花了大约3个小时,350MB,但由于这是一次锻炼,我对此没意见。下一次我将只做一个月,而不是两年的数据,所以速度会快得多。