访问:UNION溢出错误,但不包含UNION ALL或单个查询

时间:2013-08-28 04:49:00

标签: 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查询,它也给我'溢出'错误...... ??

2 个答案:

答案 0 :(得分:2)

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

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

在您的情况下,单个SELECT语句已经对db引擎造成了不寻常的负担。以前从未见过使用Nz() 67次的Access查询,并添加了所有这些值以导出一个计算字段。并且db引擎必须为每个源表的每一行再次执行该操作。

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;

答案 1 :(得分:0)

也许您的源字段包含一些#Num!由0个其他错误划分引起的。确保要与其结合的查询的记录中没有错误,而不仅仅是对于最佳结果。您可能需要滚动或使用过滤器来检查此假设。