原帖
给定两个结构如下的表:
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 - 回答安德烈提出的问题
Invalid operation.
sku
是 t1
的主键, 共有 1426 条记录。 t2
包含约 446,000 条记录,主键是 sku
的组合和 part
. WHERE
语句是部分搜索。所有“轮子”都有相同的后缀,但部件编号不同。 另外,我在 Access 2007 中,可能是与软件版本有关的问题。
将子查询变成临时表是可行的,但目标是避免该过程。
编辑#2 - 我的环境中的一个缺陷
我创建了一个与我在此处发布的相同的测试场景,并且得到了与 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 并运行查询,它没有问题。
您收到的完整错误消息是什么? (“非常复杂的无效操作。”)
您的表中有多少条记录?
是 sku
t1
中的主键?
无论如何,我建议将子查询更改为:
SELECT sku, quant
FROM t2
WHERE part = "wheel"
LIKE
仅部分搜索需要。
关于sql - 将 WHERE 语句添加到引用 ODBC 链接的子查询时访问查询失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34928576/