Cách thực hiện INSERT vào bảng ghi được trích xuất từ ​​bảng khác


177

Tôi đang cố gắng viết một truy vấn trích xuất và chuyển đổi dữ liệu từ một bảng và sau đó chèn các dữ liệu đó vào một bảng khác. Có, đây là truy vấn lưu trữ dữ liệu và tôi đang thực hiện trong MS Access. Vì vậy, về cơ bản tôi muốn một số truy vấn như thế này:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2) VALUES
  (SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1);

Tôi đã thử nhưng nhận được một thông báo lỗi cú pháp.

Bạn sẽ làm gì nếu bạn muốn làm điều này?

Câu trả lời:


283

Không có "GIÁ TRỊ", không có dấu ngoặc đơn:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;

11
thực sự nếu không các cột và kiểu của chúng giống nhau và các lối thoát đó theo cùng một thứ tự trong các bảng thì bạn có thể nói một cách đơn giản, XÁC NHẬN VÀO Bảng2 CHỌN * TỪ bảng1;
sactiw

28

Bạn có hai tùy chọn cú pháp:

lựa chọn 1

CREATE TABLE Table1 (
    id int identity(1, 1) not null,
    LongIntColumn1 int,
    CurrencyColumn money
)

CREATE TABLE Table2 (
    id int identity(1, 1) not null,
    LongIntColumn2 int,
    CurrencyColumn2 money
)

INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)

INSERT INTO Table2
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1

Lựa chọn 2

CREATE TABLE Table1 (
    id int identity(1, 1) not null,
    LongIntColumn1 int,
    CurrencyColumn money
)

INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)


SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1
INTO Table2
FROM Table1
GROUP BY LongIntColumn1

Hãy nhớ rằng Tùy chọn 2 sẽ tạo một bảng chỉ có các cột trên hình chiếu (những cột trên CHỌN).


24

Xóa cả GIÁ TRỊ và dấu ngoặc đơn.

INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1


10

Tôi tin rằng vấn đề của bạn trong trường hợp này là từ khóa "giá trị". Bạn sử dụng từ khóa "giá trị" khi bạn chỉ chèn một hàng dữ liệu. Để chèn kết quả của một lựa chọn, bạn không cần nó.

Ngoài ra, bạn thực sự không cần dấu ngoặc đơn xung quanh câu lệnh chọn.

Từ msd :

Truy vấn chắp thêm nhiều bản ghi:

INSERT INTO target [(field1[, field2[, …]])] [IN externaldatabase]
SELECT [source.]field1[, field2[, …]
FROM tableexpression

Truy vấn chắp thêm một bản ghi:

INSERT INTO target [(field1[, field2[, …]])]     
VALUES (value1[, value2[, …])

4

Xóa "giá trị" khi bạn nối thêm một nhóm hàng và xóa dấu ngoặc đơn bổ sung. Bạn có thể tránh tham chiếu vòng tròn bằng cách sử dụng bí danh cho avg (MoneyColumn) (như bạn đã làm trong ví dụ của mình) hoặc bằng cách không sử dụng bí danh nào cả.

Nếu tên cột giống nhau trong cả hai bảng, truy vấn của bạn sẽ như thế này:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn) as CurrencyColumn1
FROM Table1
GROUP BY LongIntColumn;

Và nó sẽ hoạt động mà không có bí danh:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn)
FROM Table1
GROUP BY LongIntColumn;

2

Vâng, tôi nghĩ rằng cách tốt nhất sẽ là (sẽ là?) Để xác định 2 bản ghi và sử dụng chúng làm trung gian giữa 2 bảng.

  1. Mở cả hai bản ghi
  2. Trích xuất dữ liệu từ bảng đầu tiên (CHỌN blablabla)
  3. Cập nhật tập bản ghi thứ 2 với dữ liệu có sẵn trong tập bản ghi đầu tiên (bằng cách thêm bản ghi mới hoặc cập nhật bản ghi hiện có
  4. Đóng cả hai bản ghi

Phương pháp này đặc biệt thú vị nếu bạn có kế hoạch cập nhật các bảng từ các cơ sở dữ liệu khác nhau (tức là mỗi tập bản ghi có thể có kết nối riêng ...)


2

chèn dữ liệu từ một bảng vào một bảng khác trong các dữ liệu khác nhau

insert into DocTypeGroup 
    Select DocGrp_Id,DocGrp_SubId,DocGrp_GroupName,DocGrp_PM,DocGrp_DocType 
    from Opendatasource( 'SQLOLEDB','Data Source=10.132.20.19;UserID=sa;Password=gchaturthi').dbIPFMCI.dbo.DocTypeGroup

1

Bạn có muốn chèn trích xuất trong một bảng hiện có?

Nếu nó không quan trọng thì bạn có thể thử truy vấn dưới đây:

SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 INTO T1 FROM Table1 
GROUP BY LongIntColumn1);

Nó sẽ tạo một bảng mới -> T1 với thông tin được trích xuất

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.