sql - Access : Overflow Error with UNION but not with UNION ALL or Individual Queries

标签 sql ms-access union

为什么在使用 UNION 查询而不是 UNION ALL 时会出现溢出错误? UNION 每一侧的查询本身都可以正常工作,并且每个查询所作用的表是相同的,即具有完全相同结构的实时数据表和存档数据表。

查询工作:

SELECT Format(CVDate([DateID] & " " & [TimeID]),"yyyy/mm/dd hh:nn:ss") & "-" & [RecNum] AS DateTimeRecNumID, 
    [QC Records].WONum, 
    [QC Records].InspName1, 
    [QC Records].QtyInsp, 
    Nz([008],0)+Nz([011],0)+Nz([012],0)+Nz([013],0)+Nz([014],0)+Nz([015],0)+Nz([016],0)+Nz([017],0)+Nz([018],0)+Nz([019],0)+Nz([020],0)+Nz([022],0)+Nz([023],0)+Nz([029],0)+Nz([035],0)+Nz([036],0)+Nz([037],0)+Nz([040],0)+Nz([041],0)+Nz([044],0)+Nz([045],0)+Nz([046],0)+Nz([047],0)+Nz([048],0)+Nz([050],0)+Nz([052],0)+Nz([055],0)+Nz([057],0)+Nz([059],0)+Nz([060],0)+Nz([062],0)+Nz([064],0)+Nz([066],0)+Nz([070],0)+Nz([072],0)+Nz([075],0)+Nz([077],0)+Nz([080],0)+Nz([081],0)+Nz([082],0)+Nz([083],0)+Nz([084],0)+Nz([085],0)+Nz([086],0)+Nz([088],0)+Nz([095],0)+Nz([096],0)+Nz([097],0)+Nz([111],0)+Nz([113],0)+Nz([115],0)+Nz([116],0)+Nz([117],0)+Nz([118],0)+Nz([119],0)+Nz([120],0)+Nz([121],0)+Nz([122],0)+Nz([123],0)+Nz([124],0)+Nz([125],0)+Nz([126],0)+Nz([127],0)+Nz([128],0)+Nz([129],0)+Nz([130],0)+Nz([130],0) AS SumFaults,
    1-([SumFaults]/[QtyInsp]) AS PassRate,
    [QC Records].ItemNum
FROM [QC Records]
WHERE ((([QC Records].ProdSrc)="Production"))
UNION ALL
SELECT Format(CVDate([DateID] & " " & [TimeID]),"yyyy/mm/dd hh:nn:ss") & "-" & [RecNum] AS DateTimeRecNumID,
    [QC Records (Archive)].WONum,
    [QC Records (Archive)].InspName1,
    [QC Records (Archive)].QtyInsp,
    Nz([008],0)+Nz([011],0)+Nz([012],0)+Nz([013],0)+Nz([014],0)+Nz([015],0)+Nz([016],0)+Nz([017],0)+Nz([018],0)+Nz([019],0)+Nz([020],0)+Nz([022],0)+Nz([023],0)+Nz([029],0)+Nz([035],0)+Nz([036],0)+Nz([037],0)+Nz([040],0)+Nz([041],0)+Nz([044],0)+Nz([045],0)+Nz([046],0)+Nz([047],0)+Nz([048],0)+Nz([050],0)+Nz([052],0)+Nz([055],0)+Nz([057],0)+Nz([059],0)+Nz([060],0)+Nz([062],0)+Nz([064],0)+Nz([066],0)+Nz([070],0)+Nz([072],0)+Nz([075],0)+Nz([077],0)+Nz([080],0)+Nz([081],0)+Nz([082],0)+Nz([083],0)+Nz([084],0)+Nz([085],0)+Nz([086],0)+Nz([088],0)+Nz([095],0)+Nz([096],0)+Nz([097],0)+Nz([111],0)+Nz([113],0)+Nz([115],0)+Nz([116],0)+Nz([117],0)+Nz([118],0)+Nz([119],0)+Nz([120],0)+Nz([121],0)+Nz([122],0)+Nz([123],0)+Nz([124],0)+Nz([125],0)+Nz([126],0)+Nz([127],0)+Nz([128],0)+Nz([129],0)+Nz([130],0)+Nz([130],0) AS SumFaults,
    1-([SumFaults]/[QtyInsp]) AS PassRate,
    [QC Records (Archive)].ItemNum
FROM [QC Records (Archive)]
WHERE ((([QC Records (Archive)].ProdSrc)="Production"));

不起作用(区别是 UNION 之后的“ALL”:

SELECT Format(CVDate([DateID] & " " & [TimeID]),"yyyy/mm/dd hh:nn:ss") & "-" & [RecNum] AS DateTimeRecNumID, 
    [QC Records].WONum, 
    [QC Records].InspName1, 
    [QC Records].QtyInsp, 
    Nz([008],0)+Nz([011],0)+Nz([012],0)+Nz([013],0)+Nz([014],0)+Nz([015],0)+Nz([016],0)+Nz([017],0)+Nz([018],0)+Nz([019],0)+Nz([020],0)+Nz([022],0)+Nz([023],0)+Nz([029],0)+Nz([035],0)+Nz([036],0)+Nz([037],0)+Nz([040],0)+Nz([041],0)+Nz([044],0)+Nz([045],0)+Nz([046],0)+Nz([047],0)+Nz([048],0)+Nz([050],0)+Nz([052],0)+Nz([055],0)+Nz([057],0)+Nz([059],0)+Nz([060],0)+Nz([062],0)+Nz([064],0)+Nz([066],0)+Nz([070],0)+Nz([072],0)+Nz([075],0)+Nz([077],0)+Nz([080],0)+Nz([081],0)+Nz([082],0)+Nz([083],0)+Nz([084],0)+Nz([085],0)+Nz([086],0)+Nz([088],0)+Nz([095],0)+Nz([096],0)+Nz([097],0)+Nz([111],0)+Nz([113],0)+Nz([115],0)+Nz([116],0)+Nz([117],0)+Nz([118],0)+Nz([119],0)+Nz([120],0)+Nz([121],0)+Nz([122],0)+Nz([123],0)+Nz([124],0)+Nz([125],0)+Nz([126],0)+Nz([127],0)+Nz([128],0)+Nz([129],0)+Nz([130],0)+Nz([130],0) AS SumFaults,
    1-([SumFaults]/[QtyInsp]) AS PassRate,
    [QC Records].ItemNum
FROM [QC Records]
WHERE ((([QC Records].ProdSrc)="Production"))
UNION  
SELECT Format(CVDate([DateID] & " " & [TimeID]),"yyyy/mm/dd hh:nn:ss") & "-" & [RecNum] AS DateTimeRecNumID,
    [QC Records (Archive)].WONum,
    [QC Records (Archive)].InspName1,
    [QC Records (Archive)].QtyInsp,
    Nz([008],0)+Nz([011],0)+Nz([012],0)+Nz([013],0)+Nz([014],0)+Nz([015],0)+Nz([016],0)+Nz([017],0)+Nz([018],0)+Nz([019],0)+Nz([020],0)+Nz([022],0)+Nz([023],0)+Nz([029],0)+Nz([035],0)+Nz([036],0)+Nz([037],0)+Nz([040],0)+Nz([041],0)+Nz([044],0)+Nz([045],0)+Nz([046],0)+Nz([047],0)+Nz([048],0)+Nz([050],0)+Nz([052],0)+Nz([055],0)+Nz([057],0)+Nz([059],0)+Nz([060],0)+Nz([062],0)+Nz([064],0)+Nz([066],0)+Nz([070],0)+Nz([072],0)+Nz([075],0)+Nz([077],0)+Nz([080],0)+Nz([081],0)+Nz([082],0)+Nz([083],0)+Nz([084],0)+Nz([085],0)+Nz([086],0)+Nz([088],0)+Nz([095],0)+Nz([096],0)+Nz([097],0)+Nz([111],0)+Nz([113],0)+Nz([115],0)+Nz([116],0)+Nz([117],0)+Nz([118],0)+Nz([119],0)+Nz([120],0)+Nz([121],0)+Nz([122],0)+Nz([123],0)+Nz([124],0)+Nz([125],0)+Nz([126],0)+Nz([127],0)+Nz([128],0)+Nz([129],0)+Nz([130],0)+Nz([130],0) AS SumFaults,
    1-([SumFaults]/[QtyInsp]) AS PassRate,
    [QC Records (Archive)].ItemNum
FROM [QC Records (Archive)]
WHERE ((([QC Records (Archive)].ProdSrc)="Production"));

错误是“溢出”

我还尝试对 UNION ALL 查询执行 SELECT DISTINCT 查询,它也给了我“溢出”错误...??

最佳答案

“为什么在使用 UNION 查询而不是 UNION ALL 时会出现溢出错误?”

您表示您知道 UNION 仅返回不同的行,而 UNION ALL 返回包括重复项在内的所有行。仅使用UNION,数据库引擎必须对初始工作集应用排序,以便它可以识别哪些是重复行并将其从最终结果集中消除。该排序操作给数据库引擎带来了显着的额外负担,这顺便解释了为什么 UNION ALL 总是比 UNION 更快,而且通常要快得多。

在您的情况下,各个SELECT语句已经给数据库引擎带来了不寻常的负担。我以前从未见过使用 Nz() 67 次并将所有这些值相加来派生一个计算字段的 Access 查询。数据库引擎必须对每个源表的每一行再次执行该工作。

Access 可以处理一个 SELECT 的工作负载。当您UNION ALL 其中两个时,它仍然可以应对。但是,当您强加 UNION 所需的排序要求时,Access 就会出现阻塞。

如果您的下一个问题是“我可以做什么?”,我会建议您首先查看源表。 SELECT 查询的复杂性是表设计的结果。如果无法进行更改,至少考虑是否可以运行 UPDATE 语句将源表中的 Null 替换为 0;这可能会减轻负担,使 UNION 更简单(即没有所有这些 Nz 调用)SELECT 查询成功。

作为最后的手段,请考虑将每个 SELECT 的结果集附加到临时表中:

INSERT INTO scratch_table
    (
        DateTimeRecNumID,
        WONum,
        InspName1,
        QtyInsp,
        SumFaults,
        PassRate,
        ItemNum
    )
SELECT ...

那么 Access 也许能够处理...

SELECT DISTINCT *
FROM scratch_table;

关于sql - Access : Overflow Error with UNION but not with UNION ALL or Individual Queries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18479668/

相关文章:

mysql - 限制主键的最大条目数

sql - 处理 200000 多条记录时查询非常非常慢

sql-server - Sql Server 日期类型在 MS Access 中显示为文本字段

sql - 选择使用联合查询

javascript - Typescript:将类型定义为类型与部分存在的对象的联合

MySQL如何从另一个表更新表数据?表 A 中的 1 行映射到表 B 中的 2 行

excel - Access 数据库中的 vba 上传中的语法错误

sql-server-2005 - 删除链接到 Microsoft Access 的慢速 SQL Server 表

sql - 为值行指定列名

php - 不使用 DISTINCT/GROUP BY 如何从 mysql5 表中获取唯一的数据行?