sqlite sao chép dữ liệu từ bảng này sang bảng khác


77

SQLITE

Tôi có 2 bảng "Nguồn" và "Đích" có các trường giống nhau. ID và COUNTRY, mặc dù cả hai đều có các trường khác không giống nhau.

Tôi cần sao chép giá trị Source.Country vào Destination.Country nơi tham gia trên ID

Đối với cuộc sống của tôi, tôi không thể bắt Sqlite làm điều này.

Trong SQL Server, v.v. đây là một nhiệm vụ siêu đơn giản.

Ý tưởng?


Nó sẽ là một cái gì đó một chút như thế này? stackoverflow.com/questions/2717590/…
Tom

1
CẬP NHẬT Đích đến SET quốc gia = (chọn Quốc gia từ nguồn mà id = Destination.id) WHERE TỒN TẠI (chọn 1 từ nguồn trong đó id = Destination.id);
Ian Vink

Câu trả lời:


155
INSERT INTO Destination SELECT * FROM Source;

Xem SQL Như đã hiểu bởi SQLite: CHÈN để biết định nghĩa chính thức.


2
điều đó đã thắng; không hoạt động vì tôi cần tham gia vào trường ID và chỉ cập nhật một trường (Quốc gia).
Ian Vink

5
Bạn có thể dễ dàng sửa đổi biểu thức trong SELECTtruy vấn để phù hợp với lược đồ bảng thực tế của mình.
joschi

9
Lưu ý cho noobs (như tôi). Nếu sử dụng nhiều giá trị, hãy nhớ đặt dấu ngoặc đơn cho SELECTtruy vấn của bạn, ví dụINSERT INTO users2(name, name2) VALUES ((SELECT name FROM users),(SELECT name2 FROM users));
ice ツ

1
@iceツnày chỉ chèn một bản ghi trong bảng, mặc dù tôi có nhiều bản ghi trong bảng người dùng của tôi
Amardeep Kumar Agrawal

11

Nếu bạn đã có dữ liệu trong cả hai bảng và bạn muốn cập nhật giá trị cột bảng dựa trên một số điều kiện thì hãy sử dụng

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

Làm điều này sẽ xóa dữ liệu khỏi table1 nếu table2 có ít hàng hơn table1.
zelusp

4

Tôi đã vật lộn với điều này và tôi biết có những lựa chọn khác, nhưng tôi đã đi đến kết luận rằng mô hình an toàn nhất là:

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;

Nó an toàn vì bạn có một bản sao của destinationtrước khi bạn sửa đổi nó. Tôi nghi ngờ rằng các câu lệnh cập nhật với các phép nối không được đưa vào SQLite vì chúng mạnh mẽ nhưng hơi rủi ro.

Sử dụng mẫu trên, bạn sẽ có hai countrytrường. Bạn có thể tránh điều đó bằng cách nêu rõ ràng tất cả các cột bạn muốn truy xuất từ ​​đó destination_oldvà có thể sử dụng coalesceđể truy xuất các giá trị từ destination_oldnếu countrytrường trong sourcelà rỗng. Ví dụ:

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;

1

Nếu bạn đang sao chép dữ liệu như vậy, điều đó có thể có nghĩa là mô hình dữ liệu của bạn chưa được chuẩn hóa hoàn toàn, phải không? Có thể tạo một danh sách các quốc gia và thực hiện THAM GIA thêm không?

Thay vì THAM GIA, bạn cũng có thể sử dụng các bảng ảo để không phải thay đổi các truy vấn trong hệ thống của mình.


Chúng tôi đang cập nhật từ bảng này sang bảng khác chỉ là bài tập dọn dẹp dữ liệu. Tôi chỉ cần cập nhật các trường nước (thay đổi chính tả)
Ian Vink
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.