2017-12-19 4 views
0

저는 지난 몇 주 동안보다 정규화 된 구조로 68GB 테이블을 분할하기 위해 노력해 왔으며 모든 것이 오늘까지 원활하게 진행되고 있습니다.삽입하여 선택한 데이터를 삽입하지 못했습니다.

나는이 쿼리 새 테이블로 큰 테이블에서 몇 가지 선택 열을 이동하려고 오전 : 나는 메시지를 수신

insert into [destination] (col1, col2, col3...) 
select col1, col2, col3 
From [source] 
where companyID = [source].companyID 

(60,113,678 개 행 적용됨)을하지만, 데이터가 있었다 대상에 삽입되지 않고 원본 테이블의 데이터가 변경되지 않았으므로 영향을받은 대상과 대상에 데이터가 삽입되지 않은 이유는 무엇입니까?

+1

'데이터가 대상에 삽입되지 않았습니다.'<= 어떻게 확인 했습니까? – Igor

+0

'where companyID = [source] .companyID' 테이블을 조인하려고합니까? – Sami

+0

'WHERE' 절은 아무것도하지 않습니다. 범위는'SELECT'에 국한되어 있으므로'[destination]'테이블을 볼 수 없으므로'[source]'테이블 만 볼 수 있습니다. 따라서 정규화되지 않은'companyID'는'[source]'에 대해 참조됩니다. 이것은'WHERE [source] .companyID = [source] .companyID'를 제공하는데, 당신이하고 싶지 않은가? 그것이해야 할 일을 설명해 주시겠습니까? 또한 행이 삽입되지 않았 음을 어떻게 확인 했습니까? 전체 스크립트와 결과를 보여주십시오. 'SELECT COUNT (*) FROM [destination]; 삽입 ; SELECT COUNT (*) FROM [대상]; – MatBailie

답변

1

실행하려는 것 같다 코드는 다음과 같습니다

insert into [destination] (col1, col2, col3...) 
    select s.col1, s.col2, s.col3 
    From [source] 
    where s.companyID = s.companyID; 

wheres.companyID is not null 동일합니다 : 당신이 쓴

update d 
    set col1 = s.col1, 
     col2 = s.col2, 
     col3 = s.col3 
    from destination d join 
     sources s 
     on s.companyID = s.companyId; 

코드가 동일합니다. 따라서 source의 모든 60,113,678 개의 행을 destination에 삽입했습니다.

분명히 이야기의 한 도덕은 insertupdate의 차이점을 이해하는 것입니다. 더 중요한 것은 의 모든 열 이름이 쿼리에 포함된다는 것입니다. 그렇게했다면 쿼리가 source.CompanyID = destination.CompanyId에 실패했을 것이며 60,113,678 개의 새 행을 삭제하는 방법을 알 필요가 없습니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 삽입 대신 업데이트하는 이유에 대해 질문 할 수 있습니까? – Sluggish1

+0

@ Sluggish1'companyID = [source] .companyID'는'INSERT' 대신에'UPDATE'가 필요하다는 것을 의미합니다. – Sami

+0

@ Sluggish1. . . 새 행을 삽입하는 대신 기존 행을 변경하려는 것처럼 보입니다. –

관련 문제