2017-01-28 7 views
0

MS Access에서 간단한 구성 프로그램을 작성하고 있습니다. 필수 및 무효의 두 가지 종류의 규칙이 있습니다. 잘못된 규칙의 나는이 SQL을 사용하고 잘 작동 :이 일을 tryed 한 필수 규칙에 대한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(); 

하지만 실제로 테이블의 모든 레코드에 영향을주지 않습니다, 그것은 런타임 오류를 반환 "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"선택한 상상하고, "CurrentMandatory"이런 이유로 "CurreintINvalid"및이 방법으로 채워집니다. 유효하지 않은 규칙에 대한 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

문제가있는'DELETE' 쿼리의'SELECT' 버전을 확인하십시오. 업데이트 가능한 쿼리입니까? 이러한 조인 된 테이블 또는 쿼리는 구체적으로 * CurrentMandatory *입니까? – Parfait

+0

당신의 대답에 감사드립니다, 그들은 테이블, 이상한 것은 첫 번째 삭제 잘 작동한다는 것입니다. 반면에 두 번째. 두 번째 쿼리를 SELECT로 변환하면 작동합니다. – Axel

답변

0

레코드를 삭제하려고하거나 고유하지 않거나 조인 중 하나가 데이터를 집계하는 중 하나입니다.

쿼리를 실행하여 쿼리을 선택하고 결과를 확인하십시오.

+0

답해 주셔서 감사합니다. SELECT 쿼리 버전부터 디버깅했습니다. 그것은 매우 유용했습니다. – Axel

0

좋습니다, 제안 덕분에 솔루션을 찾은 것 같습니다. "JOIN"문 안에 "="비교가 있기 때문에 첫 번째 "DELETE"가 올바르게 작동하는 것으로 보입니다. 나는 "WHERE"내부 "<>"문을 이동 한 동안 두 번째 SQL에서 나는 "가입"내부 "="문을 왼쪽했습니다

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

감사합니다.