2011-01-12 4 views
3

여기 내 상황이 있습니다. 우선, 관계형 데이터베이스에서 작업하지 않고 단순히 데이터를 조작하기위한 쉬운 방법으로 액세스를 사용하고 있습니다. 현재 테이블이 많습니다.
메인 테이블 하나를 MAIN이라고하고 10 개의 다른 테이블을 호출하자. X1, X2, X3 등을 호출 할 수있다. X1 테이블에 X1 속성이있는 항목이 포함되어있다. X2 테이블에는 X2 속성이있는 항목 등이 있습니다.ACCESS/SQL : INSERT/UPDATE를 동시에 수행하는 방법?

모든 Xx 테이블에는 동일한 필드가 있습니다. MAIN 테이블은 부울 인 필드 X1, X2 등과 같은 필드도 가지고 있습니다.

내가하고 싶은 것 :

내가 XX 테이블에서 데이터를 메인 테이블을 공급하고자합니다.
것은 여러 속성을 가진 항목이있을 수 있으므로 예를 들어 X1, X2, X5에 나타날 수 있습니다.

UPDATE MAIN 
SET itemnumber = X1.itemnumber, x1 = "true"; 

을하지만 아무것도 제공하지 않습니다 :

그래서 내가 먼저 실행에 노력했다. 지금은 MAIN 테이블에 아직 레코드가 없기 때문에 이것이 논리적이라고 가정합니다.

어쨌든 다음과 같은 쿼리를 작성할 수 있습니다.
테이블 X1의 레코드가 MAIN에 아직없는 경우 MAIN을 추가하고 X1 필드를 true로 설정하십시오.
X1 레코드가 MAIN에 이미있는 경우이를 업데이트하고 X1 필드를 true로 설정하십시오.

정말 (I를 내가 INSERT INTO를 고려하고

을 (그럼 난. 내가 가진 모든 X 테이블에 실행되도록 업데이트 할 것),하지만 난 이미 존재하는 데이터를 덮어 또는 오류가 발생하지 않도록하려면 이 모든 것에 대해 많이 알지 못함> _>)

팁을 제공 할 수있는 사람은 누구에게나 미리 감사드립니다.

편집 한 내가 먼저 (그들은 동일한 구조를 가지고)

그래서 난 처음에이 시도 메인 테이블에 XX 테이블에서 모든 데이터를 삽입 할 것이라고 생각
:

INSERT INTO MAIN.itemnumber 
(select X1.itemnumber from X1 
UNION ALL 
select X2.itemnumber from X2) 

는 작동하는지 확인하기 위해 하나의 필드에 그것을 시도했지만 그렇지 않습니다 :/

한번 생각 나는 X 테이블에서 모든 데이터를 추가 한 후, 나는 철을 실행 w 각 Xx 테이블에 대해 WHERE EXISTS를 사용하여 UPDATE하고 Xx 속성을 true로 설정하면 완료됩니다.

하지만 난 하나 ....

답변

1

내가 그동안 사용되는 대체 솔루션이 이해 한 것을 물론, 가정 Xx 표. 중복을 처리합니다.

UPDATE MAIN SET X1 = true 
WHERE exists (select * 
from X1 
where X1.itemnumber = MAIN.itemnumber); 

각 XX 테이블에 대해 반복 : 다음

는 속성을 추가 할 수 있습니다. propably없는 가장 효율적인 방법


을 (... 24 회 실제로 쿼리를 편집했다)하지만 사람이 한 번에 할 수있는 방법이있는 경우 이봐, 그것은

지금 ... 일 ...

-3
if EXISTS(*SELECT STATEMENT*) 
Begin 
    //Update 
end 
ELSE 
BEGIN 
    //Insert 
END 
+0

우리는 IF에서 IF를 사용할 수 있는지 알지 못했습니다. 이것에서 뭔가를 얻으려고 노력할 것입니다! –

+1

"IF"가 Access ... "Invalid SQL instruction"에서 작동하지 않습니다. 아니면 내가 제대로하지 않을 수도 있습니다. –

+1

명확하게 표시되고 질문의 텍스트에서 확인 된 질문에 대해 Access가 아닌 SQL을 Access로 게시하지 마십시오. -1 –

1

첫째, 당신 있습니다 작업에 몇 테이블에서 데이터를 병합으로 "간단한"같은 일을 힘든 시간을 보내고있어 관계형 데이터베이스, 비록 그것이 잘못 설계된 것입니다.

둘째, 같은 문장에서 삽입 및 업데이트 할 때 SQL을 사용할 수 없습니다.SQL Server 2008에 도입 된 특수 조항은 표준 SQL이나 Access 변형의 일부가 아닙니다.

셋째, 당신이있어 거의 바로 INSERT 당신의 편집 한의 문,하지만 아주와. 대신보십시오 : 코드에서

INSERT INTO MAIN (
    field1, 
    field2, 
    x1, 
    x2, 
    ...) 
SELECT 
    field1, 
    field2, 
    True, 
    False, 
    ... 
FROM X1 
UNION ALL 
SELECT 
    field1, 
    field2, 
    False, 
    True, 
    ... 
FROM X2 
... 

field1field2x2, & C 모든 테이블의 공통점은 "같은 필드"의 모든을위한 스탠드 기능 및 x1의 목록입니다 ., MAIN의 모든 xX 필드가 포함될 때까지 계속해야합니다. 그런 다음 에 참여하는 각 SELECT에는 MAIN의 필드 수와 일치하는 숫자가 False 개이고 위치는 True (NB : 실제 부울 데이터 유형 인 경우 따옴표 없음 - xX 필드의 경우 액세스 할 때 Null 일 수 없습니다.

INSERT INTO MAIN 
SELECT X1.itemnumber AS itemnumber 
FROM X1 
WHERE not exists (select itemnumber 
from MAIN 
where MAIN.itemnumber = X1.itemnumber); 

각 반복 :

이것은 내가 제대로 제대로 설명 스키마 .... 여기

+0

이 답변은 중복 생성을 피하는 부분을 생략 한 것으로 보입니다. –

+0

미안 설명이 개략적이라면 더 나은 방법으로 표현하는 방법을 알지 못했습니다. 나는 또한 원어민이 아니기 때문에 어쩌면 이상한 공식을 사용했을 것입니다! 그래도, 당신이 맞아 보인다 :) 한 가지 질문 : 그러나 그것은 내게이 쿼리에 문제가있을 것 : 항목이 여러 테이블에 나타날 수 있습니다 (여러 개의 속성을 가질 수 있음); 귀하의 예제에서, 항목은이 경우에도, "X2 FROM 필드 1, FIELD2, 거짓, 는 사실, ... 선택"false로 X1 속성을 넣어하지 않습니다, X1 및 X2에있는 경우 true로 설정 했습니까? –

+0

@ David-W-Fenton - 네가 맞아, 내가 쓴 것처럼 잊어 버렸다. – RolandTumble

관련 문제