sql - 将 WHERE 语句添加到引用 ODBC 链接的子查询时访问查询失败

标签 sql subquery ms-access-2007

原帖

给定两个结构如下的表:

t1 (finished goods)      t2 (component parts)

sku  | desc  | fcst       sku  | part   | quant
0001 | Car   | 10000      0001 | wheel  | 4
0002 | Boat  | 5000       0001 | door   | 2
0003 | Bike  | 7500       0002 | hull   | 1
0004 | Shirt | 2500       0002 | rudder | 1
...  | ...   | ...        0003 | wheel  | 2
                          0005 | rotor  | 2
                          ...  | ...    | ...

我正在尝试将车轮要求附加到预测中,同时将所有记录保留在预测中。我的结果如下所示:
sku  | desc  | fcst  | wheels | wheelfcst
0001 | Car   | 10000 | 4      | 40000
0002 | Boat  | 5000  |        |
0003 | Bike  | 7500  | 2      | 15000
0004 | Shirt | 2500  |        |
...  | ...   | ...   | ...    | ...

在我看来,最有效的方法是这样的查询:
SELECT 
    t1.sku, 
    t1.desc, 
    t1.fcst, 
    q.quant as wheels, 
    t1.fcst * q.quant as wheelfcst
FROM
    t1 
    LEFT JOIN
        (
            SELECT *
            FROM t2
            WHERE part LIKE "wheel"
        )
        as q
    ON t1.sku = q.sku

问题是它给出了一个非常详尽的Invalid Operation.运行时出错。

如果我删除 WHERE声明:我得到了所需的轮子零件,但我也拉门、船体和方向 Helm 的数量。

如果我移动 WHERE对主查询 (WHERE q.part LIKE "wheel") 的声明:我只看到包含轮子的 cargo ,但结果中缺少船。

我考虑过 UNION语句,取前面提到的移动WHERE的结果超出子查询(WHERE q.part LIKE "wheel"),但似乎没有一个好的方法来获取每个没有轮组件的最终项目,因为每个 sku可以有从 0 到许多组件的任何地方。

在我想要的查询中是否有一些我忽略的东西,或者这是否需要 UNION方法?

编辑#1 - 回答安德烈提出的问题

Screenshot of my personal issue.
  • 完整的错误信息是 Invalid operation.
  • skut1 的主键, 共有 1426 条记录。
  • t2包含约 446,000 条记录,主键是 sku 的组合和 part .
  • 实际WHERE语句是部分搜索。所有“轮子”都有相同的后缀,但部件编号不同。

  • 另外,我在 Access 2007 中,可能是与软件版本有关的问题。

    将子查询变成临时表是可行的,但目标是避免该过程。

    编辑#2 - 我的环境中的一个缺陷

    My test case results

    我创建了一个与我在此处发布的相同的测试场景,并且得到了与 Andre 相同的结果。在这一点上,将这些结果与临时表方法确实有效的事实相结合,我被引导相信这是查询复杂性和记录访问的问题。尽管错误消息不是典型的 Query is too complex.信息。

    编辑#3 - 深入挖掘“复杂性”

    我的下一个测试将是使 where 子句更简单。可悲的是,我每天午餐时工作的系统都会更新,目前我无法访问任何数据服务器。我希望在今天晚些时候更新我的进度。

    编辑 #4 - 替换部分搜索

    好的,我们开会回来准备出发了。我刚刚用三个不同的 WHERE 运行了六个查询条款:
    WHERE part LIKE "*heel"/WHERE component_item LIKE "*SBP" (原大规模发行)
    用于小规模测试,Invalid operation大规模。
    WHERE part LIKE "wheel"/WHERE component_item LIKE "VALIDPART" (原小规模)
    用于小规模测试,Invalid operation大规模。
    WHERE part LIKE "wh33l"/WHERE component_item LIKE "NOTVALIDPART" (不返回任何记录的 where 语句)
    Small Scale 
    sku  | desc  | fcst  | wheels | wheelfcst
    0001 | Car   | 10000 |        |
    0002 | Boat  | 5000  |        |
    0003 | Bike  | 10000 |        |
    0004 | Shirt | 5000  |        |
    
    Large Scale
    sku  |description |forecast |component_item |dip_rate
    #####|RealItem1   | ######  |               |
    #####|RealItem2   | ######  |               |
    #####|RealItem3   | ######  |               |
    ...  |...         | ...     |               |
    

    Tl;博士除非过滤器导致返回 0 条记录的子查询,否则过滤器的细节不会产生影响。

    编辑#5 - 一个有趣的结果

    在尝试所有可能的解决方案并尽可能测试一切的想法下,我制作了一个本地临时表,其中包含 t2 中的每个字段和每条记录(~25MB)。引用此表而不是指向 t2 的 ODBC 链接适用于部分搜索查询 ( WHERE component_item LIKE "*SBP" )。我正在更新此问题的标题以反射(reflect)该问题特定于链接表。

    最佳答案

    我将示例数据复制到 Access 2010 并运行查询,它没有问题。

    datasheet view of query

    您收到的完整错误消息是什么? (“非常复杂的无效操作。”)

    您的表中有多少条记录?

    sku t1 中的主键?

    无论如何,我建议将子查询更改为:

    SELECT sku, quant
    FROM t2
    WHERE part = "wheel"
    
    LIKE仅部分搜索需要。

    关于sql - 将 WHERE 语句添加到引用 ODBC 链接的子查询时访问查询失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34928576/

    相关文章:

    subquery - HQL 子查询别名

    mysql - 如果 (SELECT...) = 0 插入。在MySql中

    ms-access - 如何在表单控件中显示查询记录数

    java - 在Java中将大约80000条大数据插入postgres数据库失败

    sql - 在类型转换期间出现异常时,将条目添加到另一个表。 Postgres (PL/pgSQL)

    MySQL 将parents 字段传递给子查询而不使用JOINS

    sql - 识别 MS Access 中文本字段中的数字

    c# - 从 C# 查询 MS Access

    SQL:通过多个表获取客户的总份额

    mysql - 使用现有数据更新命令