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