2017-01-28 10 views
0

私はMS Accessでシンプルなコンフィギュレータを作成しています。必須と無効の2種類のルールがあります。私はこのSQLを使用し、それが正常に動作し、無効なルールの場合:必須規則についてMsアクセス:JOINとNOT EQUAL演算子を使用したDELETEクエリ

DELETE DISTINCTROW RuntimeBOM.* 
FROM CurrentInvalid 
INNER JOIN RuntimeBOM ON ([RuntimeBOM].[OPTION] = [CurrentInvalid].[Invalid option]) 
AND ([RuntimeBOM].[FEATURE] = [CurrentInvalid].[Invalid feature]) 
WHERE RuntimeBOM.SessionID=fOSUserName(); 

私はこの1つをしようと試みてきたが、それは、テーブル内の任意のレコードには影響しませんが、確かに、それは実行時エラーを返します。 「3086」(これは、指定されたテーブルから削除することは不可能です):

DELETE DISTINCTROW RuntimeBOM.* 
FROM CurrentMandatory 
INNER JOIN RuntimeBOM ON (RuntimeBOM.FEATURE = CurrentMandatory.MandatoryFeature) 
AND (RuntimeBOM.OPTION <> CurrentMandatory.MandatoryOption) 
WHERE RuntimeBOM.SessionID=fOSUserName(); 

fOSUserNameは()アプリケーションを実行しているコンピュータのユーザー名を取得するために、VBA関数です。このシナリオでは

╔══════════════╗ ╔══════════════════════════════════════════╗ ╔════════════════════════════════════════════╗ 
║ RuntimeBOM ║ ║    CurrentInvalid    ║ ║    CurrentMandatory    ║ 
╟───────┬──────╢ ╟────┬──────┬───────────────┬──────────────╢ ╟────┬──────┬────────────────┬───────────────╢ 
║FEATURE│OPTION║ ║Feat│Option│Invalid feature│Invalid option║ ║Feat│Option│MandatoryFeature│MandatoryOption║ 
╠═══════╪══════╣ ╠════╪══════╪═══════════════╪══════════════╣ ╠════╪══════╪════════════════╪═══════════════╣ 
║FT001 │OP001 ║ ║FTaa│OPaa │FT001   │OP001   ║ ║FTaa│OPaa │FT002   │OP008   ║ 
║FT001 │OP002 ║ ║FTaa│OPaa │FT001   │OP002   ║ ╚════╧══════╧════════════════╧═══════════════╝ 
║FT001 │OP003 ║ ║FTaa│OPaa │FT001   │OP004   ║ 
║FT001 │OP004 ║ ║FTaa│OPaa │FT001   │OP005   ║ 
║FT001 │OP005 ║ ╚════╧══════╧═══════════════╧══════════════╝ 
║FT002 │OP006 ║ 
║FT002 │OP007 ║ 
║FT002 │OP008 ║ 
║FT002 │OP009 ║ 
║FT002 │OP010 ║ 
╚═══════╧══════╝ 

は、ユーザーがどこかに「FTAA」と「OPAA」を選択した、そしてこの理由のために、「CurreintINvalid」と「CurrentMandatoryは」このように移入されている。想像します無効なルールのSQLは、FEATUREがFT001でOPTIONが "OP001"、 "OP002"、 "OP004"、 "OP005"( "CurrentInvalid"で定義されている)のRuntimeBOM内のレコードを削除します。必須ルールのSQLは、RuntimeBOM内のFEATUREがFT002、OPTIONが "OP008"( "CurrentMandatory"で定義されている)と等しくないレコードをすべて削除します。 期待される結果:

╔══════════════╗ 
    ║ RuntimeBOM ║ 
    ╟───────┬──────╢ 
    ║FEATURE│OPTION║ 
    ╠═══════╪══════╣ 
    ║FT001 │OP003 ║ 
    ║FT002 │OP008 ║ 
    ╚═══════╧══════╝ 

はありがとうございました!

+0

問題の 'DELETE'クエリの' SELECT'バージョンを確認してください。更新可能なクエリですか?これらの結合されたテーブルまたはクエリは、特に* CurrentMandatory *ですか? – Parfait

+0

あなたの答えをありがとう、彼らはテーブルです、奇妙なことは、最初の削除が正常に動作するということです。一方、第二のノー。 2番目のクエリをSELECTに変換する場合は、それが機能します。 – Axel

答えて

0

一意ではないレコードを削除しようとしているか、または結合の1つがデータを集計しています。

クエリをとして実行します。クエリを選択し、結果を確認します。

+0

あなたの答えをありがとう、私はクエリのSELECTバージョンからのデバッグを開始しました。非常に便利でした。 – Axel

0

いいえ、提案のおかげで、私は解決策を見つけたと思います。 "JOIN"ステートメントの内部には単に "="比較があるので、最初の "DELETE"は正常に機能しているようです。

DELETE DISTINCTROW RuntimeBOM.* 
FROM CurrentMandatory INNER JOIN RuntimeBOM ON (RuntimeBOM.FEATURE)=[CurrentMandatory].[MandatoryFeature] 
WHERE RuntimeBOM.SessionID=fOSUserName() And ((RuntimeBOM.OPTION)<>CurrentMandatory.MandatoryOption); 

ありがとう:私は「」内の「<>」ステートメントを移動した間に、第2 SQLで私は、「JOINの」内部「=」文を残してきました。

関連する問題