복붙노트

[SQL] SQL 업데이트는 MS Access에서 비애 - 작업이 업데이트 가능한 쿼리를 사용해야합니다

SQL

SQL 업데이트는 MS Access에서 비애 - 작업이 업데이트 가능한 쿼리를 사용해야합니다

나는 다른 테이블에서 검색 할 수 있도록 필드 포맷 기본적으로 텍스트 조작을 수행하는 선택 쿼리를 가지고 :

나는 "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 액세스 자체에 있습니다.

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

이 업데이트 쿼리 괜찮 :

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

또한, 정확히 1 개 ID는 (DD, TN)의 조합에 따라 반환되고 있다는 것을 보여준다 상기 선택 명세서에 카운트를 사용

편집하다:

내가 지금은있어 가장 간단한 경우 - T1의 기본 키와 내가 삽입 할 T1의 값 - 다양한 SELECT 문을 사용하여 나는 이제 단 2 열이있는 테이블이 있습니다.

나는 아직도 쓰기에 보일 수 없다

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

여기서 T1의 기본 키 F1이다. 에도 도움 WHERE t1.f1 IN (T2 FROM SELECT F1)를하지 않습니다 덧붙였다. (서브 쿼리가 0 결과를 반환 가능성을 제거하기 위해 추가)

해결법

  1. ==============================

    1.거기 T2에서 단 하나의 레코드가없는 한 (T2 FROM SELECT ID)의 하위 쿼리가 작동하지 않을 수 있습니다. 어떤 ID를 사용해야 기다리고 있었던거야?

    거기 T2에서 단 하나의 레코드가없는 한 (T2 FROM SELECT ID)의 하위 쿼리가 작동하지 않을 수 있습니다. 어떤 ID를 사용해야 기다리고 있었던거야?

    당신이 조인이 있고, 예를 들어 데이터 바인딩 형태의 테이블 (다시 업데이트하는 데 필요한 기본 키, 키에 대한 원래 DISTINCT 파괴한다 정보를 모두 포함하지 않을 때 일반적으로보고되는 오류 메시지가 바인드 된 그렇다면, 발생 폼에 양식)를 다시 저장 할 수 없습니다.

    당신이 DISTINCT 사용하는 사실은 서브 쿼리가 더 복잡한 예제에서 하나 개 이상의 행을 반환하는 것이 나를 의심이 만들 것입니다. 이것은 아마도 하위 쿼리 결과의 할당과 함께 가장 일반적인 문제 : 아래 - 구속 where 절을.

    내부 쿼리 구문이 잘못된 경우 나 하위 쿼리 밖으로 할당으로 본 또 다른 문제입니다. SQL 2000 년과 2005 년 다시 끝이 적어도, 쿼리 프로세서가 자동으로 실패하고 이러한 경우에 반환 NULL. (이것은 지금까지의 내가, 버그를 말할 수있다 :. 나는 최고 수준에서 오류를 반환합니다 뭔가가 자동으로 하위 쿼리에서 허용 될 수없는 이유를 볼 수 없습니다 ...하지만이)

    편집하다: 그냥 폴 아니면 둘 다 미친하지 않을 것을 보장하기 위해, 나는 다음과 같은 테이블을 생성 :

    t1 | ID, FK, Data
    t2 | ID2, Data2
    

    내가 ID2와 ID에 대한 기본 키 제약 조건을 제외한 모든 안 넣어. 모든 필드는 내가 평소 ID를 사용할 것과 다른 텍스트,했지만 관련성이 있어야합니다.

    T1 :

    ID  FK  Data
    Key1        Data1
    Key2        Data2
    Key3        Data3
    

    T2 :

    ID2 Data2
    Key1    DataA
    Key2    DataB
    Key3    DataC
    

    형태의 쿼리 :

    UPDATE t1 SET t1.FK = (select ID2 from t2 where t2.ID2 = t1.ID);
    

    같은 메시지와 함께 실패했습니다 폴 있어요.

    select *, (select ID2 from t2 where t2.ID2 = t1.ID) as foreign from t1, 
    

    예상대로 작품은, 그래서 우리는 하위 쿼리 구문을 알고 비난하지 않습니다.

    UPDATE t1 SET t1.FK = 'Key1'
    

    또한 예상대로, 우리는 손상 또는 비 갱신 대상을하지 않아도 작동합니다.

    참고 : 나는 SQL 2005 기본에서 데이터베이스 백엔드를 변경하는 경우, 업데이트가 작동합니다! 주위에 인터넷 검색, 내가 서브 쿼리를 대체 할을 DLookup을 제안 액세스의 MVP를 찾을 수의 비트 :

    http://www.eggheadcafe.com/software/aspnet/31849054/update-with-subquerycomp.aspx

    분명히 이것은 SQL Express를 2000 이상 백 엔드를 사용하는 경우 피할 액세스 SQL, 하나의 버그입니다. ( "액세스 업데이트 하위 쿼리"에 대한 구글의 결과는이 이론을 지원).

    http://www.techonthenet.com/access/functions/domain/dlookup.php :이 해결 방법을 사용하는 방법은 여기를 참조하십시오

  2. ==============================

    2.나는 OP 데이비드 W. 펜톤의 의견에 무게를해야합니다.

    나는 OP 데이비드 W. 펜톤의 의견에 무게를해야합니다.

    이것은 매우 제트 / ACE와 성가신 문제이다. 그러나 중 하나를 시도 :

    :

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

    그래서이 해결할 수있는 문제는 거의 말도 있음이 오류 메시지와 관련된 많은 문제.

    MS 액세스 한마디에있어 그 - 당신이 문제 x에 대한 무역 비밀 해결 방법을 모르는 경우, 당신은 답을 찾기 위해 노력하고 일이 걸릴 수 있습니다. 10,000 해결 방법을 알고하려면 액세스 프로그램입니다. 미숙에 대한 경고의 충분한인가?

  3. ==============================

    3.이것은 (2000 액세스) 나를 위해 일한

    이것은 (2000 액세스) 나를 위해 일한

    UPDATE DISTINCTROW T1 inner join T2 on T2.f1 = T1.f1  SET f2 = f2;
    
  4. ==============================

    4.나는 전체 스레드를 읽어 havent't, 그러나 이것은 내가 사용하고있는 솔루션입니다 :

    나는 전체 스레드를 읽어 havent't, 그러나 이것은 내가 사용하고있는 솔루션입니다 :

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

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

  5. ==============================

    5.내 솔루션은 그런 식으로 내 SQL을 변경했다.

    내 솔루션은 그런 식으로 내 SQL을 변경했다.

      update (select o.pricein, g.pricein from operations o left join goods g on g.id = o.goodid where o.opertype = 4 and o.acct = 1) 
      set o.pricein = g.pricein
    
  6. ==============================

    6.내가 같은 오류가 있었다 ( "작업이 업데이트 가능한 쿼리를 사용해야합니다") 액세스 2010 사용을 나는 내부와 간단한 업데이트 쿼리를 수행하고 가입 할 수 있습니다. 모든 내가 한 내가에 가입 된 테이블에 기본 키를 추가했다 (이미 테이블에 내가 업데이트되었다 물론, 하나 있었다) 그리고 모든했다.

    내가 같은 오류가 있었다 ( "작업이 업데이트 가능한 쿼리를 사용해야합니다") 액세스 2010 사용을 나는 내부와 간단한 업데이트 쿼리를 수행하고 가입 할 수 있습니다. 모든 내가 한 내가에 가입 된 테이블에 기본 키를 추가했다 (이미 테이블에 내가 업데이트되었다 물론, 하나 있었다) 그리고 모든했다.

  7. ==============================

    7.이것의 경우 : UPDATE T1 세트 t1.f2 = (T2 WHERE t2.f1 = t1.f1 FROM t2.f2 SELECT)

    이것의 경우 : UPDATE T1 세트 t1.f2 = (T2 WHERE t2.f1 = t1.f1 FROM t2.f2 SELECT)

    UPDATE t1 INNER JOIN t2 ON t1.f1 = t2.f1 SET t1.f2 = [t2].[f2];
    
  8. from https://stackoverflow.com/questions/537161/sql-update-woes-in-ms-access-operation-must-use-an-updateable-query by cc-by-sa and MIT license