2012-04-09 2 views
0

다소 복잡한 쿼리를 실행하려고합니다. 두 개의 테이블이 동기화되지 않았습니다. 처리의 한 단계에서 16 자리 값이 한 테이블에서 다른 테이블로 복사되고 단지 10 자리로 잘립니다.하나의 테이블에 여러 행을 같게 여러 개의 열 값을 기준으로 다른 테이블의 여러 행을 설정하는 것

전체 16 자리 숫자를 복사하는 데 몇 가지 정보를 사용하고 있습니다. 10 자리 값이 16 자리 값의 처음 10 자리와 일치하는 곳이면 어디든 찾아야하고이 두 테이블의 다른 세 가지 정보가 일치합니다. 결합하면, 우리는 거의 100 % 확신 할 수 있습니다. 이것은 내 쿼리의 현재 반복입니다.

UPDATE DB1.TABLE1 
SET ID = 
(
SELECT b.ID 
FROM DB2.TABLE1 b 
INNER DB1.TABLE1 a 
ON left(b.ID, 10) = a.ID 
WHERE len(a.ID) = 10 
AND a.STORE = b.STORE 
AND a.DOCTYPE = b.DOCTYPE 
AND a.DOCDATE = b.DOCDATE 
) 

문제는, 하위 쿼리가 여러 결과를 반환하고 있다는 것입니다. 하지만 여러 결과를 원합니다. 괄호 뒤에 또 다른 WHERE 문을 추가하고 하위 쿼리의 마지막 네 줄을 복제했지만 작동하지 않습니다. 또한 WHERE EXISTS을 사용하고 전체 SELECT 문을 복제하려고했지만 여러 결과 오류도 표시됩니다. 내가 여기서 무엇을 놓치고 있니?

답변

1

귀하의 진술은 DB1.TABLE1의 모든 행을 하위 쿼리에 의해 반환되는 것으로 업데이트하려고 시도하고 있습니다. 뿐만 아니라 그것은 당신이 원하는 것은 아니지만 하위 쿼리가 여러 값을 반환하기 때문에 문이 실패합니다.

이 오류를 제공하지 않는다는 점에서, 작동하는 것 같군 변경을하고
UPDATE DB1.TABLE1 
SET ID = b.ID 
FROM DB1.TABLE1 a 
    INNER JOIN DB2.TABLE1 b 
    ON left(b.ID, 10) = a.ID 
    AND a.STORE = b.STORE 
    AND a.DOCTYPE = b.DOCTYPE 
    AND a.DOCDATE = b.DOCDATE 
WHERE len(a.ID) = 10 
+0

:하지만,

은 무엇 당신이해야 할 것은 다음과 같이 업데이트 문의 일환으로 두 테이블의 상관 관계입니다 나는 혼란스러운 결과를 모두 얻고있다. 처음에는 테스트 데이터베이스에서 16 자리 숫자가 일치하는 새로운 올바른 상태의 행 2 개와 올바르지 않은 77 개의 행이 있습니다. 쿼리는 27 개의 행을 변경한다고 주장하지만 올바른 일치 상태에 79 개가 있습니다. 나는 아직도 이것을 연구하고 있지만, 그것이 화해되었다고 가정 할 때, 나는 정답으로 이것을 체크 할 것이다. 감사. –

+0

다른 문제점으로 인해 DB2_TABLE1에 중복 항목이 추가되어 select 문에 대한 중복 반환이 발생했습니다. UPDATE 명령이 값을 변경하면 값을 변경하면 처음에 일치했던 항목을 "무시"하게됩니까? –

+0

흠, 그게 흥미로운 질문입니다. 확실하지는 않지만 조인 기준에서도 사용되는 열을 업데이트하는 경우라면 그럴듯한 것으로 보입니다. – Chad

관련 문제