特定の期間内に結果のアクセス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の方言でチェックすることもできませんでした)。
2番目のエラーでは、サブクエリに別名を付ける必要があります。 –
また、これらの角括弧がすべて必要ではありません。カラム名にスペースが含まれている場合にのみ、Accessに必要です。いずれかの列がAccess DBに存在しない場合、角括弧内の項目はパラメータのように扱われます。可能であれば、フィールド/テーブル名から空白を削除し、すべての角括弧をクエリ文字列から削除します。 –
@SteveLovell - 列名として認識されない識別子は、角括弧で囲まれているかどうかにかかわらず、パラメータ名として扱われます。角括弧を削除する必要はありません。 –