it-swarm-vi.tech

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

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?

172
Martin08

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;
272
pilsetnieks

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

Tùy 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

Tùy 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).

25
Jorge Ferreira

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
24
GSerg

Xóa VALUES khỏi SQL của bạn.

10
Forgotten Semicolon

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[, …])
9
Sean

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 (Đơn vị tiền tệ) (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;
4
Chris OC

chèn dữ liệu từ bảng này sang 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
2
PRITESH PARMAR PINTOO

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
Philippe Grondier

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 bên dưới:

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

1
Ashwin