2009-01-14 27 views
35

Tôi đã thử tìm kiếm giải pháp tương tự ở đây nhưng không thấy giải pháp nào vì vậy tôi đã tự hỏi cách tốt nhất để thực hiện những điều sau đây là gì.Chèn hàng vào bảng cho mỗi id trong một bảng khác

Tôi có một bảng với 17 triệu + hàng tất cả đều có một ID duy nhất. Gần đây chúng tôi đã tạo một bảng mới sẽ được sử dụng kết hợp với bảng trước, trong đó khóa ngoại của bảng mới là id duy nhất của bảng cũ.

Ví dụ:
Bảng 1 - id, field1, field2, field3 ... bảng 2 - table1.id, field1 ...

Vấn đề là vì chúng ta đang di cư này thành một môi trường sống, chúng ta cần phải sao điền bảng 2 với một hàng có chứa id từ bảng 1 cho mỗi hàng trong bảng 1. ex, bảng 1 - 1, kiểm tra, null bảng 2 bây giờ cần phải có: 1, null, ... và cứ thế cho mỗi hàng nằm trong bảng 1. Vấn đề chính là các id không phải là tất cả tuần tự trong bảng 1 vì vậy chúng ta sẽ phải đọc từ bảng 1 và sau đó chèn dựa trên id được tìm thấy trong bảng 2.

Có cách nào dễ dàng hơn để thực hiện việc này không? Cảm ơn trước Joe

Cũng cần làm rõ, bảng 2 sẽ là dữ liệu mới và điều duy nhất mà nó sẽ chứa từ bảng 1 là id để giữ mối quan hệ chính nước ngoài

Ngoài ra đây là sql server 2000

Trả lời

4

Bạn cần đọc bài viết này.

What are the most common SQL anti-patterns?

Vấn đề chính là id là không phải tất cả tuần tự trong bảng 1 vì vậy chúng tôi sẽ phải đọc từ bảng 1 và sau đó chèn dựa của id của phát hiện vào bảng 2

Có, hãy xem câu trả lời của tôi trong bài viết trên và viết một vòng lặp đi bộ quan trọng bằng cách sử dụng Mục số 2.

Đảm bảo khi bạn viết câu lệnh chèn, bạn cung cấp danh sách trường - như tôi đã nói trong mụC# 1.

11

Tôi không chắc chắn tôi đang theo dõi bạn một cách chính xác, nhưng có điều gì đó giống như công việc này dành cho bạn?

INSERT INTO table2 (SELECT field1, field2, field3... FROM table1) 

Nếu tôi hiểu một cách chính xác bạn muốn có một kỷ lục trong table2 cho mỗi bản ghi trong table1. Điều này sẽ làm điều đó. Chỉ cần kết hợp các trường của bạn trong lựa chọn theo thứ tự đúng và chỉ định hằng số cho bất kỳ trường nào trong bảng2 mà bạn không có trong bảng 1.

HTH. Hãy cho tôi biết nếu tôi không hiểu và tôi sẽ cố gắng giúp đỡ lần nữa.

+0

Có hoạt động cú pháp này trong SQL server? Khi thử nó, tôi nhận được một lỗi mà nói "Lỗi gần SELECT" – Trevor

+0

có, điều này cũng nên làm việc cho máy chủ sql. Tạo một câu hỏi với cú pháp của bạn thats ném một lỗi và gửi một liên kết nếu bạn muốn. –

+8

Để làm cho nó hoạt động trong SQL Server, tôi phải viết: INSERT INTO table2 (field1, field2, field3) SELECT field1, field2, field3 FROM table1 – ConnorsFan

-1

Với nhiều hàng bạn có thể gặp sự cố với không gian nhật ký giao dịch và khoảng thời gian chạy các giao dịch chèn lớn.

Nếu thời gian chạy là một hạn chế tôi nghiêm túc muốn khuyên bạn nên sử dụng BCP (hay bất cứ những công cụ được áp dụng tùy thuộc vào nền tảng này)

Chọn ra của id từ bảng gốc, sử dụng để xây dựng một tập tin BCP cho bảng mở rộng, sau đó Bcp nó trong.

Bạn có thể thấy nó hoạt động hiệu quả hơn với Bcp trong tệp 10.000 bản ghi thay vì một tệp humungus với 17.000.000 hàng.

Ngoài ra, bạn có thể thực hiện việc này ở mặt sau trước khi phát trực tiếp và viết một công việc t-sql để nhận và có thể đã được chèn sau khi bạn đã chụp hình lưu niệm của id.

44

Nếu tôi hiểu chính xác, bạn muốn có một bản ghi trong bảng 2 cho mỗi bản ghi trong bảng 1. Ngoài ra tôi tin rằng ngoài việc tham chiếu đến table1, table2 ban đầu nên chứa các hàng trống.

Vì vậy, giả sử

table1 (ID, field1, field2, ...) 
table2 (ID, table1_ID, fieldA, fieldB,...) 
-- where table1_ID is a reference to ID of table1 

Sau khi tạo table2 bạn chỉ có thể chạy câu lệnh insert này

insert into table2(table1_ID) 
select ID from table1 
Các vấn đề liên quan