2012-06-03 3 views
0

좋아 내가 두 테이블 다음 필드SQL에서 다른 필드의 값에 따라 한 테이블에서 다른 테이블로 값을 복사하는 방법은 무엇입니까?

ACTIVATIONCODE 
SERIALNUMBER 
VOUCHERDATADBID 
UNAVAILABLEAT 
UNAVAILABLEOPERATORDBID 
AVAILABLEAT 
AVAILABLEOPERATORDBID 
ACTIVATIONCODENEW 
EXT1  
EXT2  
EXT3  
DENOMINATION -- I added this column into the table. 

두 번째 표는 다음 필드 VOUCHERDATAT이다와

VOUCHERT이

VOUCHERDATADBID 
BATCHID 
VALUE 
CURRENCY 
VOUCHERGROUP 
EXPIRYDATE 
AGENT 
EXT1 
EXT2 
EXT3 

내가 해당 값을 복사됩니다 싶지 VOUCHERDATAT에서 가져 와서 VOUCHERT의 DENOMINATION에 넣으십시오. 이 둘 사이의 연결은 VOUCHERDATADBID입니다. 어떻게해야합니까?

1 : 1 매핑이 아닙니다. 내 말은 동일한 VOUCHERDATADBID를 가진 1000 개의 SERIALNUMBERS가있을 수 있다는 것입니다. 그리고 VOUCHERDATADBID는 VOUCHERDATAT에 하나의 값만을 가지고 있습니다. 따라서 특정 VOUCHERDATADBID에 속하는 모든 일련 번호는 동일한 값을가집니다.

JOINS가 작동합니까? 어떤 종류의 JOIN을 사용해야합니까? 아니면 UPDATE 테이블에 갈 방법입니까?

도움을 주셔서 감사합니다.

답변

3

문제는 디자인 중 하나입니다. 귀하의 테이블 중 어느 것도 정상적인 양식이 아니며 첫 번째 정규형 (1NF)조차도 포함되지 않습니다. 다음 컬럼으로 VOUCHERT 테이블에 열을 추가 할 수 있지만 새 테이블을 (이름을 선택) 작성해서는 안 : SERIALNUMBER는, VALUE, VOUCHERDATADBID은 (아마도 ACTIVATIONCODE도 - 필요가 기본 키를 알고 VOUCHERTACTIVATIONCODE이해야하는 경우 확인하기 위해 새 테이블에 포함됨). 정규화는 가능한 모든 오류를 해결하는 것을 목표로하는 데이터베이스 설계 프로세스입니다. 변칙적 인 변칙을 해결하는 것이 좋습니다. 이렇게하면 INSERT 문제가 해결됩니다.

희망이 도움이됩니다.

0

이 두 테이블간에 조인을 수행하면 '보기'가 표시됩니다. 다음과 같이보기를 업데이트 할 수 있습니다.

UPDATE (SELECT * 
     FROM VOUCHERT A JOIN VOUCHERDATAT B 
      ON A.VOUCHERDATADBID = B.VOUCHERDATADBID) 
SET DENOMINATION = VALUE; 

필요에 따라 외부 조인을 넣을 수 있습니다.

VOUCHERDATADBID 그렇지 않으면 오류 얻을 것이다, VOUCHERDATAT 및 VOUCHERT에서 FOREIGN KEY에서 PRIMARY KEY해야합니다 voucherdatadbid에 기본 키가 아닌 경우

ORA-01779: cannot modify a column which maps to a non key-preserved table 
+0

이전 쿼리를 실행하려고 시도했지만 두 번 타임 아웃되었습니다. 처음에는 6 시간 동안 뛰었고 2 시간 만에 3 시간 동안 뛰었습니다. 이 버전을 사용해 보시고 다시 연락 드리겠습니다. 감사 ! – Joshua1729

+0

그래서 문제는 테이블이 너무 큽니다! 각 테이블에 몇 개의 행이 있습니까? –

+0

바우처에는 264,582,461 개의 행이 있고 바우처 데이터에는 994 개의 행이 있습니다. 여기가 문제가되는 곳입니다. RAM이 충분하지 않습니다. – Joshua1729

0
update (
     select v.DENOMINATION 
     ,  vd.VALUE 
     from VOUCHERT v 
     join VOUCHERDATAT vd 
     on  vd.VOUCHERDATADBID = v.VOUCHERDATADBID 
     ) t 
set  t.DENOMINATION = t.Value 
+0

은 참여하지 않아야합니다 ... ON? 대신에? JOIN을 쉼표로 바꾸면 어디에서나 이전 스타일의 조인을 얻을 수 있습니다. –

+0

@CosminVacaroiu : 예, 답장에서 편집 된 '위치'대신 '켜기'여야합니다. – Andomar

+0

다음 오류가 발생합니다. "as t"가 유효합니까? 코드를 한 줄씩 복사했습니다. 감사합니다 ORA-00971 : 누락 된 SET 키워드 – Joshua1729

0

을이 작동합니다 :

UPDATE vouchert 
    SET denomination = 
     (SELECT MAX(value) 
      FROM voucherdatat 
     WHERE voucherdatadbid = vouchert.voucherdatadbid); 
+0

"FROM voucherdatat"이라고 생각하십니까? - 고마워요. 너에게 돌아가. – Joshua1729

+0

예, 맞습니다. – DCookie

+0

그리고 2 억 4 천 4 백만 행을 업데이트하는 경우 잠시 시간을 할애 할 준비를하십시오. – DCookie

관련 문제