2010-11-27 12 views
45

SQLitesqlite 한 테이블에서 다른 테이블로 데이터 복사

"Source"와 "Destination"테이블에는 동일한 필드가 있습니다. ID와 COUNTRY가 있지만 공통점이없는 다른 필드도 있습니다.

는 나는 내가 SQLite는이 작업을 수행 할 수없는 내 인생 ID

에 조인 Destination.Country에 Source.Country 값을 복사해야합니다.

SQL Server에서 이것은 매우 간단한 작업입니다.

아이디어가 있으십니까?

+1

UPDATE 대상 = SET 국가 (일부 국가 소스에서 어디 ID = Destination.id) WHERE EXISTS (소스에서 하나를 선택 어디 ID = Destination.id); –

+0

조금 비슷한 것일까 요? http://stackoverflow.com/questions/2717590/sqlite-upsert-on-duplicate-key-update – Tom

답변

100
INSERT INTO Destination SELECT * FROM Source; 

공식 정의는 SQL As Understood By SQLite: INSERT을 참조하십시오.

+1

원 : ID 필드에 가입하고 하나의 필드 (국가) 만 업데이트하면됩니다. –

+4

실제 테이블 스키마와 일치하도록'SELECT' 쿼리에서 표현식을 쉽게 수정할 수 있습니다. – joschi

1

그런 데이터를 복사하면 데이터 모델이 완전히 정규화되지 않았을 가능성이 있습니다. 맞습니까? 하나의 국가 목록을 작성하고 JOIN을 더 할 수 있습니까?

JOIN 대신 가상 테이블을 사용할 수도 있으므로 시스템의 쿼리를 변경할 필요가 없습니다.

+0

우리는 하나의 테이블에서 또 다른 테이블로 데이터를 정리하고 있습니다. 국가 필드 (철자 변경)를 업데이트하면됩니다 –

4

당신은 두 테이블에 이미 존재하는 데이터를 가지고 있고 나는이와 씨름했습니다이

UPDATE Table1 set Name=(select t2.Name from Table2 t2 where t2.id=Table1.id) 
+0

이렇게하면 table2에 table1보다 적은 행이 있으면 table1의 데이터가 지워집니다. – zelusp

1

을 사용하는 일부 조건에 따라 테이블 열 값을 업데이트 할, 그리고 I가 알고 있다면 다른 옵션은,하지만 가장 안전한 패턴이 결론에 도달했습니다 당신이 그것을 변경하기 전에 destination의 사본을 가지고 있기 때문에

create table destination_old as select * from destination; 

drop table destination; 

create table destination as select 
d.*, s.country 
from destination_old d left join source s 
on d.id=s.id; 

그것은 안전합니다. 나는 강력하지만 조금 위험하기 때문에 조인이 포함 된 업데이트 문은 SQLite에 포함되어 있지 않은 것으로 생각됩니다.

위의 패턴을 사용하면 두 개의 country 필드로 끝납니다. 명시 적으로 검색하려는 모든 열을 destination_old에서 명시하고 coalesce을 사용하여 sourcecountry 필드가 null 인 경우 destination_old에서 값을 검색하는 것을 피할 수 있습니다. 그래서 예를 들면 :

create table destination as select 
d.field1, d.field2,...,coalesce(s.country,d.country) country 
from destination_old d left join source s 
on d.id=s.id; 
관련 문제