2017-05-13 31 views
0

特定の期間内に結果のアクセスDBを照会しようとしています。私が照会しているときに、データが属する週(週の範囲から)を自動的に列に追加して出力に追加したいと考えています。 automagic列は、パラメーターをSELECTステートメントに渡すことによって生成されます。私は2つの間違いの間を行き来し続けます、なぜ私は理由を理解できません。パラメータが多すぎると予想されるMS Accessのpyodbc

エラー1)パラメータが少なすぎます。 JOINに

ERROR 2)構文エラー

マイPythonコード:

ERROR 1つのコード:

pyodbc.Error: ('07002', '[07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 8. (-3010) (SQLExecDirectW)') 

からエイリアスを削除する:

qry = ''' 
    SELECT [PreQuery].[defect], SUM([PreQuery].[qty_rej] + [PreQuery].[qty_rew]) AS [qty_defect], ? AS [wk_no] 
    FROM (
     SELECT [Sort].[Date of Sort] AS [srt_date], [Part].[Part Name] AS [prt_no], [Defect Table].[Defect2] AS [defect], [Defect Table].[Quantity Rejected] AS [qty_rej], [Defect Table].[Quantity Reworked] AS [qty_rew] 
     FROM (([Defect Table] LEFT JOIN [Sort] ON [Defect Table].[Sort Number] = [Sort].[Sort Number]) LEFT JOIN [Part] ON [Sort].[Part Number] = [Part].[Part Number])) AS PreQuery LEFT JOIN [Defects] ON [Defects].[Defect Code] = [PreQuery].[Defect2] 
    WHERE (([Sort].[Date of Sort] BETWEEN ? AND ?) AND ([Part].[Part Name] LIKE ? & '_TZ______')) 
    GROUP BY [defect], [wk_no];''' 

は、次のエラーを発生させ[Sort]。[Sort of Date]と[Part]。[Part Name]は、ドライバー以外の同じエラーを再現します。前述のようにの代わりに、のパラメータを使用します。いずれの場合も、は4つだけですか?文全体にがありますので、DBは4つのパラメータを必要としています。

ERROR 2コード:

qry = ''' 
    SELECT ? AS [wk_no], [defect], SUM([qty_rej] + [qty_rew]) AS [qty_defect] 
    FROM (
     SELECT [Sort].[Date of Sort], [Part].[Part Name], [Defect Table].[Defect2] AS [defect], [Defect Table].[Quantity Rejected] AS [qty_rej], [Defect Table].[Quantity Reworked] AS [qty_rew] 
     FROM (([Defect Table] LEFT JOIN [Sort] ON [Defect Table].[Sort Number] = [Sort].[Sort Number]) 
     LEFT JOIN [Part] ON [Sort].[Part Number] = [Part].[Part Number])) 
    LEFT JOIN [Defects] ON [Defects].[Defect Code] = [Defect Table].[Defect2] 
    WHERE (([Sort].[Date of Sort] BETWEEN ? AND ?) AND ([Part].[Part Name] LIKE ? & '_TZ______')) 
    GROUP BY [defect], [wk_no];''' 

これが発生します

pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error in JOIN operation. (-3510) (SQLExecDirectW)') 

を、私は、それ自体で、内側のSELECT文をチェックし、それがいずれの場合には完全に罰金を実行。さらに、私は明らかな構文エラーを見ることができませんでした(PyCharmはMySQLの方言でチェックすることもできませんでした)。

+0

2番目のエラーでは、サブクエリに別名を付ける必要があります。 –

+0

また、これらの角括弧がすべて必要ではありません。カラム名にスペースが含まれている場合にのみ、Accessに必要です。いずれかの列がAccess DBに存在しない場合、角括弧内の項目はパラメータのように扱われます。可能であれば、フィールド/テーブル名から空白を削除し、すべての角括弧をクエリ文字列から削除します。 –

+0

@SteveLovell - 列名として認識されない識別子は、角括弧で囲まれているかどうかにかかわらず、パラメータ名として扱われます。角括弧を削除する必要はありません。 –

答えて

0

全体的に、両方のクエリの試みの中でいくつかの問題があります。

  1. を連結リテラル'_TZ______'?、プレースホルダとしてあなたの最後のパラメータ値に、独自の上に立つ必要があります。
  2. 最初のクエリと同様に、派生テーブルPreQueryにテーブルエイリアスを割り当てる必要があります。
  3. JOINは、の欠陥ではなく、の新しい列の別名である必要があります。Defect2
  4. WHERE句をサブクエリ内に移動します。
  5. 実際のフィールドではないため、wk_noGROUP BYに削除してください。定数はGROUP BYを必要としません。

長さと読みやすさを減らすために、テーブルのエイリアスを使用して構文を調整することを検討してください。もちろん、データなしでは、私は十分にテストすることができません。したがって、さらに調整する必要があります。

qry = """ 
    SELECT ? AS [wk_no], [defect], SUM([qty_rej] + [qty_rew]) AS [qty_defect] 
    FROM 
     (
     SELECT s.[Date of Sort], p.[Part Name], d.[Defect2] AS [defect], 
       d.[Quantity Rejected] AS [qty_rej], d.[Quantity Reworked] AS [qty_rew] 
     FROM (([Defect Table] d LEFT JOIN [Sort] s ON d.[Sort Number] = s.[Sort Number]) 
       LEFT JOIN [Part] p ON s.[Part Number] = p.[Part Number]) 
     WHERE ((s.[Date of Sort] BETWEEN ? AND ?) AND (p.[Part Name] LIKE ?)) 
    ) As PreQuery 
    LEFT JOIN [Defects] ON [Defects].[Defect Code] = [PreQuery].[defect]   
    GROUP BY [defect]; 
""" 

cursor.execute(qry, myparams) # WHERE LAST PARAM HAS '_TZ______' CONCATENATED TO ORIG VALUE 
+0

* "プレースホルダー、'? 'は、それ自身の上に立つ必要があります。* - 実際は必要ありません。実際には、SQLコマンド・テキスト内の文字列式の一部として文字列パラメータを使用できます。 –

+0

ありがとうございます。あなたの提案を実装し、結果を報告します。 –

+0

'FROM ... JOIN'セクションに括弧がありません。数えて見てください。アクセスSQLは、他の方言と違ってテーブルのペアリングを囲むために、かっこで厳密です。初心者は、MSAccess.exe GUIプログラム内でデザインビルダを使用してクエリを作成する必要があります。 – Parfait

関連する問題