2009-03-05 12 views
3

SQL Server 2005からテーブルビューをリンクしたレポートに使用するAccess MDBがあります。POテーブルの情報を取得し、他のテーブルの情報に応じて個別明細を更新することができます。私は、(データを作成する)プライマリアプリケーションの必要に応じて、互換性モード80からサーバー上の90に移行した約1カ月前まで、クエリが正常に機能していることは確かです。 100%の確実性でこれを言うことはできませんが、それは過去90日間に行われた唯一の大きな変化です。突然データがクエリに表示されず、レポートが奇妙に見えることがわかりました。アクセスクエリは、テーブルのリンク方法に応じて空のフィールドを返します。

これは失敗したクエリのコピーです:

SELECT dbo_porel.jobnum, dbo_joboper.opcode, dbo_porel.jobseqtype, 
    dbo_opmaster.shortchar01, 
    dbo_porel.ponum, dbo_porel.poline, dbo_podetail.unitcost 

FROM ((dbo_porel 
LEFT JOIN dbo_joboper ON (dbo_porel.assemblyseq = dbo_joboper.assemblyseq) 
    AND (dbo_porel.jobseq = dbo_joboper.oprseq) 
    AND (dbo_porel.jobnum = dbo_joboper.jobnum)) 
LEFT JOIN dbo_opmaster ON dbo_joboper.opcode = dbo_opmaster.opcode) 
LEFT JOIN dbo_podetail ON (dbo_porel.poline = dbo_podetail.poline) 
    AND (dbo_porel.ponum = dbo_podetail.ponum) 

WHERE (dbo_porel.jobnum="367000003") 

それは次の値を返します。

jobnum opcode jobseqtype shortchar01 ponum poline unitcost 
367000003   S      6624  2  15 


クエリが正常にオペコードとshortchar01の値を表示しているはずです。リンクされたテーブルdbo_podetailを削除すると、これらのフィールドのデータが正しく表示されます(ただし、私は明らかにunitcostを持っていません)。最初はデータの問題だと思っていましたが、クエリをネストしてテーブルをリンクすると、うまくいきました。

は、たとえば次のコードは完璧に動作します:

SELECT qryTest.*, dbo_podetail.unitcost 

FROM (

    SELECT dbo_porel.jobnum, dbo_joboper.opcode, dbo_porel.jobseqtype, 
     dbo_opmaster.shortchar01, dbo_porel.ponum, dbo_porel.poline 

    FROM (dbo_porel 
    LEFT JOIN dbo_joboper ON (dbo_porel.jobnum=dbo_joboper.jobnum) 
     AND (dbo_porel.jobseq=dbo_joboper.oprseq) 
     AND (dbo_porel.assemblyseq=dbo_joboper.assemblyseq)) 
    LEFT JOIN dbo_opmaster ON dbo_joboper.opcode=dbo_opmaster.opcode 

    WHERE (dbo_porel.jobnum="367000003") 

) As qryTest 
LEFT JOIN dbo_podetail ON (qryTest.poline = dbo_podetail.poline) 
    AND (qryTest.ponum = dbo_podetail.ponum) 


私はそれが最初のケースでは、後者の場合には動作しない理由のために途方に暮れてよ。さらに悪いことに、一部のレコードでは断続的に動作するように見えますが、他のレコードでは動作しないように見えます(これは動作しないとうまく動作しません)。

あなたの専門家がいらっしゃいますか?

+0

SELECTステートメントの列の1つが、クエリのメインテーブルのPKですか?第2に、テーブルにタイムスタンプフィールドがあり、それをすべてのSQL文に含めると、Accessはバインドされたフォームでデータを表示して更新する作業が改善されます。 –

答えて

1

をあきらめて申し訳ありません。
私は左/右の結合をちょうど連鎖しているなら混乱するJetオプティマイザの限界だと思います。

see that this is a recurrent problem表面が多い場合があります。

+0

Jetクエリオプティマイザが間違っている場合は、パススルーを使用しますか? –

+0

私はかなりの量の検索をしましたが、この質問に対する答えは見つかりません。これはVBAのパススルークエリに対処しない限り、私が得た唯一の答えのようです。 –

0

私は、Accessのジョインで大括弧を使用すると常に混乱します。余分な括弧を削除してみてください。

FROM 
    dbo_porel 
LEFT JOIN 
    dbo_joboper ON (dbo_porel.assemblyseq = dbo_joboper.assemblyseq) 
     AND (dbo_porel.jobseq = dbo_joboper.oprseq) 
     AND (dbo_porel.jobnum = dbo_joboper.jobnum) 
LEFT JOIN 
    dbo_opmaster ON (dbo_joboper.opcode = dbo_opmaster.opcode) 
LEFT JOIN 
    dbo_podetail ON (dbo_porel.poline = dbo_podetail.poline) 
     AND (dbo_porel.ponum = dbo_podetail.ponum) 

OK上記動作しません - 私はあなたは間違いなく右のアクセスに参加する/複数の左用のサブクエリを使用する必要が

+0

アクセスは、読みやすさよりも安全性に優れています。操作の順序は次のように簡略化することができます。 –

+0

余分な角括弧を(コードスニペットごとに)削除して、スローアウトを実行することを拒否しました。 "構文エラー"無効な演算子 –