2

UNION ALL ではなく UNION クエリを使用すると、オーバーフロー エラーが発生するのはなぜですか?? 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クエリを実行しようとしましたが、「オーバーフロー」エラーも発生しています...??

4

2 に答える 2

2

「UNION ALL ではなく UNION クエリを使用すると、オーバーフロー エラーが発生するのはなぜですか?」

UNION個別の行のみをUNION ALL返し、重複を含むすべての行を返すことに気付いていることを示しました。justを使用UNIONすると、db エンジンは最初のワーキング セットに並べ替えを適用して、どの行が重複しているかを特定し、最終的な結果セットからそれらを削除できるようにする必要があります。その並べ替え操作は、db エンジンにかなりの追加の負担を課します。偶然にも、なぜUNION ALLが常に より速くUNION、非常に多くの場合劇的に速いかを説明しています。

あなたの場合、個々のSELECTステートメントはすでにdbエンジンに異常な負担を課しています。Nz()67 回使用し、それらすべての値を加算して 1 つの計算フィールドを導出するAccess クエリを見たことがありません。そして、db エンジンは、各ソース テーブルのすべての行に対して、その作業を再度実行する必要があります。

アクセスは 1 つのワークロードに対応できSELECTます。そして、あなたが2人いるときでも、それは対処できUNION ALLます。ただし、 に必要な並べ替え要件を課すと、Access が停止しますUNION

次の質問が「代わりに何ができますか?」、まずソース テーブルを確認することをお勧めします。クエリの複雑さは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;
于 2013-08-28T15:12:23.030 に答える
0

ソース フィールドに #Num! が含まれている可能性があります。0 その他のエラーによる除算が原因です。上位の結果だけでなく、ユニオンを作成するクエリのレコードにエラーがないことを確認してください。この仮説を確認するには、スクロールするかフィルターを使用する必要がある場合があります。

于 2015-07-21T20:20:45.037 に答える