【问题标题】:"Expression is either incorrect or too complex"“表达式不正确或太复杂”
【发布时间】:2018-08-01 19:48:52
【问题描述】:

我相信我需要学习如何更优雅地编写以下代码。问题是我正在使用一堆表(不是我创建了这些表,否则我会将其简化为一个。)&我需要同时查询所有表的信息。我正在使用 MS Access,这就是我的 SQL 语句目前的样子:

SELECT [Date (mm-dd-yy)], [Operator], [Operator Number], [Product Part Number], [Feet Produced], [Run Time], [Feet Produced]/[Run Time] AS [AVG Prod]
From [tblReports_16Braiding]
WHERE ((([Product Part Number])=[Forms]![AdminProdForm].[PartNumber]) AND [Date (mm-dd-yy)] Between [Forms]![AdminProdForm].[StartDate] And [Forms]![AdminProdForm].[EndDate]);
    Union
    SELECT [Date (mm-dd-yy)], [Operator], [Operator Number], [Product Part Number], [Feet Produced], [Run Time], [Feet Produced]/[Run Time] AS [AVG Prod]
From  [tblReports_24Braiding]
WHERE ((([Product Part Number])=[Forms]![AdminProdForm].[PartNumber]) AND [Date (mm-dd-yy)] Between [Forms]![AdminProdForm].[StartDate] And [Forms]![AdminProdForm].[EndDate]);
    Union
SELECT [Date (mm-dd-yy)], [Operator], [Operator Number], [Product Part Number], [Feet Produced], [Run Time], [Feet Produced]/[Run Time] AS [AVG Prod]
From [tblReports_Cabling]
WHERE ((([Product Part Number])=[Forms]![AdminProdForm].[PartNumber]) AND [Date (mm-dd-yy)] Between [Forms]![AdminProdForm].[StartDate] And [Forms]![AdminProdForm].[EndDate]);
Union
SELECT [Date (mm-dd-yy)], [Operator], [Operator Number], [Product Part Number], [Feet Produced], [Run Time], [Feet Produced]/[Run Time] AS [AVG Prod]
 From [tblReports_CompChain]
WHERE ((([Product Part Number])=[Forms]![AdminProdForm].[PartNumber]) AND [Date (mm-dd-yy)] Between [Forms]![AdminProdForm].[StartDate] And [Forms]![AdminProdForm].[EndDate]);
Union
SELECT [Date (mm-dd-yy)], [Operator], [Operator Number], [Product Part Number], [Feet Produced], [Run Time], [Feet Produced]/[Run Time] AS [AVG Prod]
From [tblReports_Jacketing]
WHERE ((([Product Part Number])=[Forms]![AdminProdForm].[PartNumber]) AND [Date (mm-dd-yy)] Between [Forms]![AdminProdForm].[StartDate] And [Forms]![AdminProdForm].[EndDate]);
Union
SELECT [Date (mm-dd-yy)], [Operator], [Operator Number], [Product Part Number], [Feet Produced], [Run Time], [Feet Produced]/[Run Time] AS [AVG Prod]
From [tblReports_Primary]
WHERE ((([Product Part Number])=[Forms]![AdminProdForm].[PartNumber]) AND [Date (mm-dd-yy)] Between [Forms]![AdminProdForm].[StartDate] And [Forms]![AdminProdForm].[EndDate]);
Union
SELECT [Date (mm-dd-yy)], [Operator], [Operator Number], [Product Part Number], [Feet Produced], [Run Time], [Feet Produced]/[Run Time] AS [AVG Prod]
From [tblReports_Printing]
WHERE ((([Product Part Number])=[Forms]![AdminProdForm].[PartNumber]) AND [Date (mm-dd-yy)] Between [Forms]![AdminProdForm].[StartDate] And [Forms]![AdminProdForm].[EndDate]);
Union
SELECT [Date (mm-dd-yy)], [Operator], [Operator Number], [Product Part Number], [Feet Produced], [Run Time], [Feet Produced]/[Run Time] AS [AVG Prod]
From [tblReports_Respool]
WHERE ((([Product Part Number])=[Forms]![AdminProdForm].[PartNumber]) AND [Date (mm-dd-yy)] Between [Forms]![AdminProdForm].[StartDate] And [Forms]![AdminProdForm].[EndDate]);
UNION SELECT [Date (mm-dd-yy)], [Operator], [Operator Number], [Product Part Number], [Feet Produced], [Run Time], [Feet Produced]/[Run Time] AS [AVG Prod]
 From [tblReports_Stranding]
WHERE ((([Product Part Number])=[Forms]![AdminProdForm].[PartNumber]) AND [Date (mm-dd-yy)] Between [Forms]![AdminProdForm].[StartDate] And [Forms]![AdminProdForm].[EndDate]);

简而言之,我只是想将大量表格合并在一起。都具有相同的字段,从其他两个字段的简单划分创建一个新字段,然后使用表单查询联合表。每当我现在运行它时,都会收到一条错误消息,指出我的 SQL 错误或太复杂。我猜想太复杂了,因为我正在处理九个表中的超过 20,000 条记录。

编辑~~~

删除我最大的表(大约 8000 个条目)上的操作表达式后,代码可以正常工作。取出这个操作:

[Feet Produced]/[Run Time] AS [AVG Prod]
    From  [tblReports_24Braiding]

但是在我的查询中我需要这个字段。我无法在表本身中执行此操作,因为它是一个链接表,因此我无法保存对它的更改。

【问题讨论】:

  • 我想知道访问是否会更好地处理 select * from(从表联合中选择字段从表 2 联合中选择字段等...)条件。执行一个 select 语句来联合所有没有过滤的表,然后将 where 过滤器应用于该大量联合。虽然这似乎有点反直觉,但我过去用这种方法很幸运

标签: sql ms-access


【解决方案1】:

显式声明参数,让Access免于猜测:

PARAMETERS
    [Forms]![AdminProdForm].[PartNumber]) Long,
    [Forms]![AdminProdForm].[StartDate] DateTime,
    [Forms]![AdminProdForm].[EndDate] DateTime;

SELECT 
    [Date (mm-dd-yy)], [Operator], [Operator Number], [Product Part Number], [Feet Produced], [Run Time], [Feet Produced]/[Run Time] AS [AVG Prod]
FROM 
    [tblReports_16Braiding]
WHERE 
    ((([Product Part Number])=[Forms]![AdminProdForm].[PartNumber]) AND [Date (mm-dd-yy)] Between [Forms]![AdminProdForm].[StartDate] And [Forms]![AdminProdForm].[EndDate]);

UNION ALL

SELECT ...  <snip>

【讨论】:

  • 我添加了参数,仍然没有运气。每当我删除最大表(8000 个条目)上的操作表达式时,代码都可以正常工作。我的 tblReports_24Braiding 上的 [Feet Produced]/[Run Time] AS [AVG Prod]
  • 检查该表是否存在讨厌的值或这些字段中的空值。和/或:该查询会自行运行吗?
  • 没有任何空值 - 是的!查询将自行运行。只是每当我将它与 SQL 语句的其余部分结合起来时,就会出现太复杂的错误
  • 然后尝试将查询一分为二。如果这些运行,则使用第三个查询来合并这两个查询。
猜你喜欢
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多