MS Access의 SQL 업데이트 문제 - 작업에서 업데이트 가능한 쿼리를 사용해야합니다.


Answers

나는 David W. Fenton의 OP에 대한 언급에 무게를 두어야한다.

이것은 Jet / ACE에서 매우 귀찮은 문제입니다. 그러나 다음 중 하나를 시도하십시오.

  1. 쿼리 속성으로 이동하여 (테이블이 표시되는 창 배경 클릭) '고유 레코드'를 '예'로 설정하십시오.
  2. 옵션 1은 다소 이상하게 보이는 DISTINCTROW 키워드를 SELECT 절에 추가하는 것과 같습니다.

:

UPDATE DISTINCTROW tblClient 
       INNER JOIN qryICMSClientCMFinite 
          ON tblClient.ClientID = qryICMSClientCMFinite.ClientID
   SET tblClient.ClientCMType = "F";

이렇게하면이 오류 메시지와 관련된 많은 문제가 거의 우스꽝스럽게 해결됩니다.

간단히 말해 MS Access입니다. 문제 x에 대한 영업 비밀 해결 방법을 모르면 답을 찾기 위해 며칠이 걸릴 수 있습니다. 10,000 개의 해결 방법을 알고있는 것은 Access를 프로그래밍하는 것입니다. 초동력이 충분하다는 경고입니까?

Question

내가 본질적으로 필드를 다시 포맷 할 수 있도록 일부 텍스트 조작을 수행하는 선택 쿼리를 사용하여 다른 테이블에서 찾을 수 있습니다.

첫 번째 테이블에 "J1 / 2"와 같은 필드가 있으면 해당 필드에서 J1과 J2가있는 다른 테이블의 레코드 ID를 찾습니다.

이 모든 것이 잘 작동합니다.

이제 더 이상이 문자열 조작을 사용하여 조회를 수행 할 필요가 없도록 원본 테이블을 업데이트하려고하지만 업데이트 쿼리에서 내 시도가 "작업에서 업데이트 가능한 쿼리를 사용해야합니다"

어떤 아이디어?

내 SELECT 문 :

SELECT DISTINCT
t1.DD,
t1.TN,
t1.DD & " J" & MID(t1.TN,2,1) AS CalculatedStart,
t1.DD & " J" & MID(t1.TN,4,1) AS CalculatedEnd,
t2.ID
FROM t1 INNER JOIN t2
ON (t1.DD & " J" & MID(t1.TN,2,1)=t2.StartLink)
AND (t1.DD & " J" & MID(t1.TN,4,1)=t2.EndLink)
WHERE t1.TN Like "J?/?"
AND t1.DD Like "M*";

리콜 -이 잘 작동하고 필요한 다른 t2.ID 얻을.

그래서 나는 다음과 같이하고 싶다.

UPDATE t1 SET t2ID = (
    SELECT Query1.ID
    FROM Query1
    WHERE t1.DD=Query1.DD
    AND t1.TN=Query1.TN
    )
WHERE t1.TN Like "J?/?"
AND t1.DD Like "M*";

이것 만 실패합니다. 이것은 MS Access 자체 내에 있으므로 대부분의 "작업이 업데이트 가능한 쿼리를 사용해야합니다"와 같은 실제 사용 권한 문제는 아닌 것 같아 보입니다.

편집 : 작동하지 않는 경우를 단순화하려고.

이 UPDATE 쿼리는 정상입니다.

UPDATE t1
SET t2ID="Unknown"
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";

이 하나가 실패합니다 (Goedke 감사합니다 -이 예제는 하위 쿼리가 1 개 이상의 결과를 반환하기 때문에 분명히 실패합니다.) 문제를 찾기 위해 지나치게 단순화했습니다.

UPDATE t1
SET t2ID=(SELECT ID FROM t2)
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";

그래서 난 그냥 내 부질의 문법을 어떤 식 으로든 잘못 했나요?

편집 :이 SELECT 문을 너무 좋습니다.

SELECT t1.OA, t1.DD, t1.TN, t1.HATRIS,
    query1.DD, query1.TN, query1.ID
FROM t1 INNER JOIN query1
ON t1.DD=query1.DD
AND t1.TN=query1.TN

또한 위의 select 문에서 count를 사용하면 정확히 (ID, TN) 조합 당 1 개의 ID가 반환된다는 것을 알 수 있습니다

편집하다:

필자가 지금까지 간 가장 간단한 경우 - 다양한 SELECT 문 사용 이제는 t1의 기본 키와 t1에 삽입하려는 값이 2 열만있는 테이블이 생겼습니다.

나는 아직도 쓸 수 없다.

UPDATE t1 SET t1.f2 = (SELECT t2.f2 FROM t2 WHERE t2.f1 = t1.f1)

여기서 t1의 기본 키는 f1입니다. 심지어 t1.f1 IN (SELECT f1 FR2 t2)을 추가해도 도움이되지 않습니다. (하위 쿼리가 0 개의 결과를 반환 할 가능성을 제거하기 위해 추가됨)




전체 스레드를 읽을 수는 없지만 이것이 내가 사용하고있는 솔루션입니다.

update (select * from t1 inner join t2 on t1.key = t2.key) set t1.field1 = t2.field2

그리고 나를 위해 MS 액세스에서 잘 작동합니다.




Access 2010을 사용하여 동일한 오류 ( "작업은 업데이트 가능한 쿼리를 사용해야합니다")가 있었으며 내부 조인을 사용하여 간단한 업데이트 쿼리를 수행하고있었습니다. 내가했던 모든 작업은 내가 가입했던 테이블에 기본 키를 추가하는 것뿐이었습니다 (이미 업데이트 중이던 테이블에서 이미 하나의 테이블을 가지고있었습니다). 모든 것이 작동했습니다.