Chèn tất cả các giá trị của một bảng vào một bảng khác trong SQL


128

Tôi đang cố gắng chèn tất cả các giá trị của một bảng vào một bảng khác. Nhưng câu lệnh chèn chấp nhận các giá trị, nhưng tôi muốn nó chấp nhận một lựa chọn * từ init_Table. Điều này có thể không?

Câu trả lời:


262

Câu lệnh chèn thực sự có một cú pháp để làm việc đó. Sẽ dễ dàng hơn rất nhiều nếu bạn chỉ định tên cột thay vì chọn "*":

INSERT INTO new_table (Foo, Bar, Fizz, Buzz)
SELECT Foo, Bar, Fizz, Buzz
FROM initial_table
-- optionally WHERE ...

Tôi nên làm rõ điều này hơn vì một số lý do bài đăng này đang nhận được một vài lượt bình chọn.

Cú pháp INSERT INTO ... CHỌN TỪ dành cho khi bảng bạn đang chèn vào ("new_table" trong ví dụ của tôi ở trên) đã tồn tại. Như những người khác đã nói, cú pháp CHỌN ... VÀO là khi bạn muốn tạo bảng mới như một phần của lệnh.

Bạn đã không xác định liệu bảng mới có cần được tạo như một phần của lệnh hay không, do đó, XÓA VÀO ... CHỌN TỪ sẽ ổn nếu bảng đích của bạn đã tồn tại.


3
Cái-- Ai đó muốn để lại cho tôi một bình luận giải thích lý do tại sao bài đăng này đang tạo ra phiếu bầu? Tôi không thấy bất cứ điều gì trong câu hỏi OP chỉ định rằng bảng mới sẽ được tạo như một phần của truy vấn.
Matt Hamilton

Làm thế nào để xử lý vi phạm ràng buộc toàn vẹn? Ví dụ: nếu một bản sao duy nhất được sao chép, nó có dừng truy vấn hoặc chỉ bỏ qua mục cụ thể đó không?
Martin Dale Lyness

Tôi tin rằng nó sẽ gây ra lỗi và khôi phục giao dịch, nghĩa là không có gì được sao chép. Giá trị thử nghiệm mặc dù.
Matt Hamilton

25

Thử cái này:

INSERT INTO newTable SELECT * FROM initial_Table

2
Không hoạt động khi sử dụng các ngôi sao khi chúng tôi có cột nhận dạng
Mohsen Tavoosi مسن اوسی

Đối với kịch bản này với danh tính, hãy thêm SET IDENTITY_INSERT tên_bảng BẬT đầu tiên và tương tự với tắt ở cuối để chèn các giá trị nhận dạng.
Juan

13

Bạn có thể chèn bằng truy vấn con như sau:

INSERT INTO new_table (columns....)
SELECT columns....
FROM initial_table where column=value



4

Có một cách dễ dàng hơn khi bạn không phải nhập bất kỳ mã nào (Lý tưởng để thử nghiệm hoặc cập nhật một lần):

Bước 1

  • Nhấp chuột phải vào bảng trong trình thám hiểm và chọn "Chỉnh sửa 100 hàng trên cùng";

Bước 2

  • Sau đó, bạn có thể chọn các hàng mà bạn muốn ( Ctrl + Nhấp hoặc Ctrl + A ), và Nhấp chuột phải và Sao chép ( Lưu ý : Nếu bạn muốn thêm điều kiện " ở đâu ", sau đó Nhấp chuột phải vào Lưới -> Ngăn -> SQL ngay bạn có thể chỉnh sửa Truy vấn và thêm điều kiện WHERE, sau đó Nhấp chuột phải lần nữa -> Thực thi SQL, các hàng bắt buộc của bạn sẽ có sẵn để chọn ở phía dưới)

Bước 3

  • Thực hiện theo Bước 1 cho bảng mục tiêu.

Bước 4

  • Bây giờ đi đến cuối lưới và hàng cuối cùng sẽ có dấu hoa thị (*) trong cột đầu tiên (Hàng này là để thêm mục mới). Nhấp vào đó để chọn toàn bộ hàng đó và sau đó PASTE ( Ctrl + V ). Các tế bào có thể có một dấu sao đỏ (chỉ ra rằng nó không được lưu)

Bước 5

  • Nhấp vào bất kỳ hàng nào khác để kích hoạt câu lệnh chèn (Dấu hoa thị đỏ sẽ biến mất)

Lưu ý - 1 : Nếu các cột không theo đúng thứ tự như trong bảng Target, bạn luôn có thể làm theo Bước 2 và Chọn các Cột theo thứ tự như trong bảng Target

Lưu ý - 2 - Nếu bạn có các cột Danh tính thì hãy thực hiện SET IDENTITY_INSERT sometableWithIdentity ONvà sau đó làm theo các bước trên và cuối cùng thực hiệnSET IDENTITY_INSERT sometableWithIdentity OFF


3

Nếu bạn đang truyền nhiều dữ liệu vĩnh viễn, tức là không điền vào bảng tạm thời, tôi khuyên bạn nên sử dụng SQL Server Nhập / Xuất dữ liệu cho ánh xạ bảng-bảng.

Công cụ Nhập / Xuất thường tốt hơn SQL thẳng khi bạn có chuyển đổi loại và cắt giảm giá trị có thể có trong ánh xạ của bạn. Nói chung, ánh xạ của bạn càng phức tạp, bạn càng sử dụng công cụ ETL như Dịch vụ Tích hợp (SSIS) thay vì SQL trực tiếp.

Công cụ Nhập / Xuất thực sự là một trình hướng dẫn SSIS và bạn có thể lưu công việc của mình dưới dạng gói dtsx.


2

Tôi nghĩ rằng tuyên bố này có thể làm những gì bạn muốn.

INSERT INTO newTableName (SELECT column1, column2, column3 FROM oldTable);

0
 Dim ofd As New OpenFileDialog
                ofd.Filter = "*.mdb|*.MDB"
                ofd.FilterIndex = (2)
                ofd.FileName = "bd1.mdb"
                ofd.Title = "SELECCIONE LA BASE DE DATOS ORIGEN (bd1.mdb)"
                ofd.ShowDialog()
                Dim conexion1 = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + ofd.FileName
                Dim conn As New OdbcConnection()
                conn.ConnectionString = conexion1
                conn.Open()



            'EN ESTE CODIGO SOLO SE AGREGAN LOS DATOS'
            Dim ofd2 As New OpenFileDialog
            ofd2.Filter = "*.mdb|*.MDB"
            ofd2.FilterIndex = (2)
            ofd2.FileName = "bd1.mdb"
            ofd2.Title = "SELECCIONE LA BASE DE DATOS DESTINO (bd1.mdb)"
            ofd2.ShowDialog()
            Dim conexion2 = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + ofd2.FileName
            Dim conn2 As New OdbcConnection()
            conn2.ConnectionString = conexion2
            Dim cmd2 As New OdbcCommand
            Dim CADENA2 As String

            CADENA2 = "INSERT INTO EXISTENCIA IN '" + ofd2.FileName + "' SELECT * FROM EXISTENCIA IN '" + ofd.FileName + "'"


            cmd2.CommandText = CADENA2
            cmd2.Connection = conn2
            conn2.Open()
            Dim dA2 As New OdbcDataAdapter
            dA2.SelectCommand = cmd2
            Dim midataset2 As New DataSet
            dA2.Fill(midataset2, "EXISTENCIA")
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.