2017-01-28 20 views
0

我正在MS Access中編寫一個簡單的配置程序。有兩種規則,強制性和無效性。對於無效的規則,我用這個SQL,它工作正常:小姐訪問:刪除查詢JOIN和NOT EQUAL運算符

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

對於我tryed這一個強制性的規則,但它不會影響任何記錄在表中,的確,它會返回運行時錯誤「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 ║ 
╚═══════╧══════╝ 

在這種情況下想象中的用戶選擇了「美洲自由貿易區」和「OPAA」的地方,因爲這個原因「CurreintINvalid」和「CurrentMandatory」以這種方式填充。對於無效規則的SQL,刪除RuntimeBOM內的記錄,其中FEATURE等於FT001,OPTION等於「OP001」,「OP002」,「OP004」,「OP005」(如在「CurrentInvalid」中定義的那樣)。強制規則的SQL刪除RuntimeBOM中的所有記錄,其中FEATURE等於FT002,OPTION不等於「OP008」(如在「CurrentMandatory」中定義的那樣)。 預期結果:

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

謝謝!

+0

檢查問題的'SELECT'版本'DELETE'查詢。它是一個可更新的查詢嗎?那些聯合表或查詢本身,特別是* CurrentMandatory *? – Parfait

+0

感謝您的回答,他們是表格,奇怪的是第一個刪除工作正常。而第二號。如果將第二個查詢轉換爲SELECT,它將起作用。 – Axel

回答

0

要麼你正試圖刪除一條記錄,這不是唯一的,和/或你的一個連接是聚合數據。

將查詢作爲運行選擇查詢,並驗證結果。

+0

感謝您的回答,我從查詢的SELECT版本開始調試。它非常有用。 – Axel

0

好的,多虧了這些建議,我想我已經找到了解決方案。 看起來第一個「DELETE」工作正常,因爲在「JOIN」語句中只有「=」比較。在第二個SQL我已經離開了裏面的「加入」「=」語句,而我搬到裏面的「WHERE」中的「<>」聲明:

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

感謝。