แทรกค่าทั้งหมดของตารางลงในตารางอื่นใน SQL


128

ฉันพยายามแทรกค่าทั้งหมดของตารางหนึ่งลงในอีกตารางหนึ่ง แต่คำสั่งแทรกยอมรับค่า แต่ฉันต้องการให้ยอมรับ select * จาก initial_Table เป็นไปได้หรือไม่

คำตอบ:


262

คำสั่งแทรกมีไวยากรณ์สำหรับการทำเช่นนั้นจริงๆ ง่ายกว่ามากหากคุณระบุชื่อคอลัมน์แทนที่จะเลือก "*" แต่:

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

ฉันควรชี้แจงเรื่องนี้ดีกว่าเพราะด้วยเหตุผลบางประการโพสต์นี้ได้รับการโหวตลดลงเล็กน้อย

ไวยากรณ์ INSERT INTO ... SELECT FROM ใช้สำหรับเมื่อมีตารางที่คุณกำลังแทรก ("new_table" ในตัวอย่างด้านบน) อยู่แล้ว ดังที่คนอื่น ๆ กล่าวไว้ไวยากรณ์ SELECT ... INTO มีไว้สำหรับเมื่อคุณต้องการสร้างตารางใหม่โดยเป็นส่วนหนึ่งของคำสั่ง

คุณไม่ได้ระบุว่าจะต้องสร้างตารางใหม่เป็นส่วนหนึ่งของคำสั่งหรือไม่ดังนั้น INSERT INTO ... SELECT FROM ควรจะใช้ได้ถ้าตารางปลายทางของคุณมีอยู่แล้ว


3
Wha--? มีคนต้องการแสดงความคิดเห็นอธิบายว่าทำไมโพสต์นี้ถึงได้รับการโหวตลดลง? ฉันไม่เห็นอะไรเลยในคำถาม OP ที่ระบุว่าควรสร้างตารางใหม่เป็นส่วนหนึ่งของแบบสอบถาม
Matt Hamilton

วิธีนี้จัดการกับการละเมิดข้อ จำกัด ด้านความสมบูรณ์ได้อย่างไร ตัวอย่างเช่นหากมีการซ้ำกันที่ไม่ซ้ำกันจะเป็นการหยุดการสืบค้นหรือเพียงข้ามรายการนั้นไป
Martin Dale Lyness

ฉันเชื่อว่าจะเกิดข้อผิดพลาดและย้อนกลับธุรกรรมซึ่งหมายความว่าไม่มีการคัดลอก คุ้มค่ากับการทดสอบ
Matt Hamilton

25

ลองสิ่งนี้:

INSERT INTO newTable SELECT * FROM initial_Table

2
ไม่ทำงานเมื่อใช้ดาวเมื่อเรามีคอลัมน์ประจำตัว
Mohsen Tavoosi محسنطاوسی

สำหรับสถานการณ์นี้ที่มีเอกลักษณ์ให้เพิ่ม SET IDENTITY_INSERT table_name ON ก่อนและเช่นเดียวกันโดยปิดท้ายเพื่อแทรกค่าเอกลักษณ์
Juan

13

คุณสามารถแทรกโดยใช้แบบสอบถามย่อยดังนี้:

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



4

มีวิธีที่ง่ายกว่าที่คุณไม่ต้องพิมพ์รหัสใด ๆ (เหมาะสำหรับการทดสอบหรืออัปเดตครั้งเดียว):

ขั้นตอนที่ 1

  • คลิกขวาที่ตารางใน explorer และเลือก "แก้ไข 100 แถวบนสุด";

ขั้นตอนที่ 2

  • จากนั้นคุณสามารถเลือกแถวที่คุณต้องการ ( Ctrl + ClickหรือCtrl + A ) และคลิกขวาและคัดลอก ( หมายเหตุ : หากคุณต้องการเพิ่มเงื่อนไข " ที่ไหน " ให้คลิกขวาที่ Grid -> Pane -> SQL Now คุณสามารถแก้ไขแบบสอบถามและเพิ่มเงื่อนไข WHERE จากนั้นคลิกขวาอีกครั้ง -> ดำเนินการ SQL แถวที่คุณต้องการจะมีให้เลือกที่ด้านล่าง)

ขั้นตอนที่ 3

  • ทำตามขั้นตอนที่ 1 สำหรับตารางเป้าหมาย

ขั้นตอนที่ 4

  • ตอนนี้ไปที่จุดสิ้นสุดของเส้นตารางและแถวสุดท้ายจะมีเครื่องหมายดอกจัน(*)ในคอลัมน์แรก (แถวนี้คือการเพิ่มรายการใหม่) คลิกเพื่อเลือกแถวนั้นทั้งหมดแล้ววาง ( Ctrl + V ) เซลล์อาจมีเครื่องหมาย Asterix สีแดง (แสดงว่าไม่ได้บันทึกไว้)

ขั้นตอนที่ 5

  • คลิกที่แถวอื่นเพื่อเรียกใช้คำสั่งแทรก (เครื่องหมาย Red Asterix จะหายไป)

หมายเหตุ - 1 : ถ้าคอลัมน์ไม่อยู่ในลำดับที่ถูกต้องเหมือนในตารางเป้าหมายคุณสามารถทำตามขั้นตอนที่ 2 ได้ตลอดเวลาและเลือกคอลัมน์ตามลำดับเดียวกันกับในตารางเป้าหมาย

หมายเหตุ - 2 - หากคุณมีคอลัมน์ Identity ให้ดำเนินการSET IDENTITY_INSERT sometableWithIdentity ONจากนั้นทำตามขั้นตอนข้างต้นและในตอนท้ายดำเนินการSET IDENTITY_INSERT sometableWithIdentity OFF


3

หากคุณกำลังถ่ายโอนข้อมูลล็อตอย่างถาวรเช่นไม่เติมข้อมูลในตารางชั่วคราวฉันขอแนะนำให้ใช้ข้อมูลนำเข้า / ส่งออกของเซิร์ฟเวอร์ SQLสำหรับการแมปแบบตารางต่อตาราง

เครื่องมือนำเข้า / ส่งออกมักจะดีกว่า SQL แบบตรงเมื่อคุณมีการแปลงประเภทและการตัดทอนค่าที่เป็นไปได้ในการแมปของคุณ โดยทั่วไปยิ่งการทำแผนที่ของคุณซับซ้อนมากเท่าไหร่คุณก็จะยิ่งมีประสิทธิผลมากขึ้นโดยใช้เครื่องมือ ETL เช่น Integration Services (SSIS) แทนที่จะใช้ SQL โดยตรง

เครื่องมือนำเข้า / ส่งออกเป็นวิซาร์ด SSIS และคุณสามารถบันทึกงานของคุณเป็นแพ็คเกจ dtsx



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