2010-07-21 4 views
0

선택 기준에 포함 된 열을 업데이트해도 아무 문제가 없어야한다고 생각합니다.조인 열을 업데이트 할 때 액세스가 쓰레기가 됨

update table1 as t1 
inner join table2 as t2 on t1.id = t2.old_id 
set t1.id = t2.id 

내가 old_id하는 ID를 매핑 표 2를 사용
나는 여전히 이상한 결과를 제공하는 쿼리가 있습니다.
table1.id와 table2.id는 모두 기본 키입니다. table2.old_id도 고유합니다.

이 업데이트 후에 table1.id는 여전히 고유합니다.
잘못되었습니다. MS Access는 일부 table.id 값 중복으로이 문제를 일으킬 것입니다.

그러나 이것은 조인에 사용되는 열을 업데이트하는 올바른 방법이라고 생각하십니까? MS Access에서 원하는 결과를 얻으려면 어떻게해야합니까?

참고 : table2는 ODBC를 통해 액세스되는 mysql보기입니다.

답변

1

table1.id 및 table2.id 모두 기본 키입니다. table2.old_id도 입니다.

이 업데이트 이후 table1.id는 여전히 이됩니다.

꼭 그렇지는 않습니다.

old_ID와 (새로운) ID가 동일한 데이터 유형으로 보입니다. 술어 (table1.ID = table2.old_ID)에 따라 table2에서 일치하는 행이없는 table1의 행은 갱신되지 않습니다. 다른 행은 (새) ID 값과 일치 할 수 있으므로 업데이트되지 않으며 업데이트되지 않은 행과 동일한 값으로 업데이트됩니다.

다음은 표준 SQL (Access/Jet가 아닌 SQL Server 2008에서 작동)을 사용하는 예제입니다. 내가 다시 작성한 참고하여 내가 전달하려고 무엇의 논리 맞도록 EXISTS 구조를 사용하여 INNER JOIN :

WITH Table1 (ID) AS 
    (
     SELECT ID 
     FROM (
       VALUES (1), 
        (2), 
        (3), 
        (4) 
      ) AS Table2 (ID) 
    ), 
    Table2 (old_ID, ID) AS 
    (
     SELECT old_ID, ID 
     FROM (
       VALUES (1, 55), 
        (2, 99), 
        (3, 4) 
      ) AS Table2 (old_ID, ID) 
    ) 
-- ID of rows that will not be updated: 
SELECT T1.ID 
    FROM Table1 AS T1 
WHERE NOT EXISTS (
        SELECT * 
        FROM Table2 AS T2 
        WHERE T1.ID = T2.old_ID 
       ) 
UNION ALL 
-- updated IDs 
SELECT T2.ID 
    FROM Table2 AS T2 
WHERE EXISTS (
       SELECT * 
       FROM Table1 AS T1 
       WHERE T1.ID = T2.old_ID 
      ); 

결과 집합 : 비록, 즉

ID 
--- 
4 --<-- duplicate 
55 
99 
4 --<-- duplicate 

을 모든 다음은 고유 :

(table1.ID) 
(table2.ID) 
(table2.old_ID) 

... 다음이 포함될 수 있습니다 중복 :

,536,
table1.ID 
UNION ALL 
table2.ID 
+0

나는이 상황에 대해 테스트 한 것으로 생각했지만, 바로 이것이 조인 업데이트가 잘못된 결과를내는 원인입니다. OMG Ponies가 설명하는 솔루션이 Access에서 근본적으로 거부 된 것은 이상합니다. subselect를 사용한 업데이트가 Access에서 전혀 작동하지 않는 것 같습니다. Access에 관한 문서는 내가 본 것 중에 가장 가난한 문서입니다. –

0

UPDATE 문에서 JOIN을 사용하는 것이 지속적으로 지원되지 않습니다. 그 이유는 내 습관이 아닙니다.

UPDATE TABLE1 AS t1 
    SET t1.id = (SELECT t2.id 
        FROM TABLE2 t2 
       WHERE t2.old_id = t1.id) 
+0

Thnx,하지만 이제 업데이트 할 수있는 쿼리에서 작업을 수행해야한다는 문제가 발생합니다. 그 상황에서 어떻게 대처합니까? –

+0

@Exception e : "업데이트 가능한 쿼리"가 무엇인지 설명하십시오. –

+0

업데이트 할 수있는 쿼리에 대해 작업을 수행해야합니다. 영어 버전에서 얻을 수있는 오류 메시지는 정확히 "작업은 업데이트 할 수있는 쿼리를 사용해야합니다"입니다. 그것은 MS 토크, 나도 이해가 안돼. –

관련 문제