วิธีแทรก INSERT ในบันทึกของตารางที่แยกจากตารางอื่น


177

ฉันพยายามเขียนแบบสอบถามที่แยกและแปลงข้อมูลจากตารางแล้วแทรกข้อมูลเหล่านั้นลงในอีกตารางหนึ่ง ใช่นี่เป็นคลังข้อมูลแบบสอบถามและฉันทำมันใน MS Access ดังนั้นโดยทั่วไปฉันต้องการแบบสอบถามเช่นนี้

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

ฉันลอง แต่ได้รับข้อความแสดงข้อผิดพลาดทางไวยากรณ์

คุณจะทำอย่างไรถ้าคุณต้องการทำสิ่งนี้?

คำตอบ:


283

ไม่ "VALUES" ไม่มีวงเล็บ:

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

11
จริงถ้าไม่ ของคอลัมน์และประเภทของพวกเขาเหมือนกันและทางออกเหล่านั้นอยู่ในลำดับเดียวกันในตารางจากนั้นคุณสามารถพูดได้ว่า INSERT INTO Table2 SELECT * จาก Table1;
sactiw

28

คุณมีสองตัวเลือกไวยากรณ์:

ตัวเลือกที่ 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

ตัวเลือก 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

โปรดทราบว่าตัวเลือกที่ 2 จะสร้างตารางที่มีเฉพาะคอลัมน์ในการฉายภาพ (ที่อยู่บน SELECT)


24

ลบทั้งค่าและวงเล็บ

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


10

ฉันเชื่อว่าปัญหาของคุณในกรณีนี้คือคำหลัก "ค่า" คุณใช้คำสำคัญ "ค่า" เมื่อคุณแทรกข้อมูลแถวเดียวเท่านั้น สำหรับการแทรกผลลัพธ์ของตัวเลือกคุณไม่จำเป็นต้องใช้

นอกจากนี้คุณไม่จำเป็นต้องใช้วงเล็บในคำสั่ง select

จากmsdn :

แบบสอบถามแบบใช้ผนวกข้อมูลหลายระเบียน:

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

แบบสอบถามแบบใช้ผนวกข้อมูลระเบียนเดียว:

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

4

ลบ "ค่า" ออกเมื่อคุณต่อท้ายกลุ่มของแถวและลบวงเล็บเพิ่มเติม คุณสามารถหลีกเลี่ยงการอ้างอิงแบบวงกลมโดยใช้นามแฝงสำหรับ avg (CurrencyColumn) (ตามที่คุณทำในตัวอย่างของคุณ) หรือโดยไม่ใช้นามแฝงเลย

หากชื่อคอลัมน์เหมือนกันในทั้งสองตารางแบบสอบถามของคุณจะเป็นดังนี้:

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

และมันจะทำงานโดยไม่มีนามแฝง:

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

2

ฉันคิดว่าวิธีที่ดีที่สุดคือ (จะเป็นอย่างไร) เพื่อกำหนดชุดระเบียน 2 ชุดและใช้เป็นสื่อกลางระหว่าง 2 ตาราง

  1. เปิดชุดระเบียนทั้งสอง
  2. แยกข้อมูลจากตารางแรก (SELECT blablabla)
  3. ปรับปรุงชุดระเบียนที่ 2 ด้วยข้อมูลที่มีอยู่ในชุดระเบียนชุดแรก (โดยเพิ่มระเบียนใหม่หรือปรับปรุงระเบียนที่มีอยู่
  4. ปิดชุดระเบียนทั้งสอง

วิธีนี้น่าสนใจอย่างยิ่งหากคุณวางแผนที่จะอัพเดทตารางจากฐานข้อมูลที่แตกต่างกัน (เช่นแต่ละชุดระเบียนสามารถมีการเชื่อมต่อของตัวเอง ... )


2

การแทรกข้อมูลจากตารางหนึ่งไปยังอีกตารางหนึ่งในฐานข้อมูลที่แตกต่างกัน

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

คุณต้องการแทรกการแยกในตารางที่มีอยู่หรือไม่?

หากไม่สำคัญคุณสามารถลองใช้แบบสอบถามด้านล่าง:

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

มันจะสร้างตารางใหม่ -> T1 พร้อมข้อมูลที่แยกออกมา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.