รวม INSERT INTO และกับ / CTE


157

ฉันมี CTE ที่ซับซ้อนมากและฉันต้องการแทรกผลลัพธ์ลงในตารางทางกายภาพ

ต่อไปนี้ถูกต้องหรือไม่

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos 
(
    BatchID,
    AccountNo,
    APartyNo,
    SourceRowID
)       
WITH tab (
  -- some query
)    
SELECT * FROM tab

ฉันคิดว่าจะใช้ฟังก์ชั่นในการสร้าง CTE นี้ซึ่งจะทำให้ฉันสามารถใช้งานได้อีกครั้ง ความคิดใด ๆ

คำตอบ:


271

คุณต้องใส่ CTE ก่อนแล้วจึงรวม INSERT INTO เข้ากับคำสั่งที่คุณเลือก นอกจากนี้คำหลัก "AS" ที่ตามหลังชื่อของ CTE ก็ไม่ใช่ทางเลือก:

WITH tab AS (
    bla bla
)
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID,
AccountNo,
APartyNo,
SourceRowID
)  
SELECT * FROM tab

โปรดทราบว่ารหัสจะถือว่า CTE จะส่งคืนสี่เขตข้อมูลที่แน่นอนและเขตข้อมูลเหล่านั้นจะจับคู่ตามลำดับและพิมพ์ตามที่ระบุในคำสั่ง INSERT หากไม่ใช่กรณีนี้ให้แทนที่ "SELECT *" ด้วยการเลือกเฉพาะของฟิลด์ที่คุณต้องการ

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

กับ common_table_expression (Transact-SQL)


19

WITHข้อสำหรับสามัญนิพจน์ตารางไปที่ด้านบน

การแทรกทุกการแทรกใน CTE มีประโยชน์ในการแยกตรรกะการสืบค้นออกจากการแมปคอลัมน์

จุดผิดพลาด:

WITH _INSERT_ AS (
  SELECT
    [BatchID]      = blah
   ,[APartyNo]     = blahblah
   ,[SourceRowID]  = blahblahblah
  FROM Table1 AS t1
)
INSERT Table2
      ([BatchID], [SourceRowID], [APartyNo])
SELECT [BatchID], [APartyNo], [SourceRowID]   
FROM _INSERT_

ความผิดพลาดเดียวกัน:

INSERT Table2 (
  [BatchID]
 ,[SourceRowID]
 ,[APartyNo]
)
SELECT
  [BatchID]      = blah
 ,[APartyNo]     = blahblah
 ,[SourceRowID]  = blahblahblah
FROM Table1 AS t1

แผ่นบางแผ่นทำให้ง่ายต่อการตรวจสอบรหัสแทรกจำนวนคอลัมน์ที่เหมาะสมในลำดับที่ถูกต้องแม้จะมีคอลัมน์จำนวนมาก ตัวคุณในอนาคตของคุณจะขอบคุณในภายหลัง


3
มันเยี่ยมมาก! ทั้งหมดทันทีฉันไม่เกลียดคำสั่ง INSERT มาก ...
NReilingh

1
มันมีประโยชน์มาก สำหรับคนอื่นที่ไม่ได้อ่านมันในการอ่านครั้งแรกปัญหาที่แก้ไขนี้คือในคำสั่งแทรกการแมปถูกกำหนดโดยการเรียงลำดับที่เกี่ยวข้องของฟิลด์ที่จะแทรกลงในและค่าที่จะแทรกลงในพวกเขาซึ่งจะแสดงรายการแยกต่างหาก หากคุณเขียนสิ่งเหล่านี้ตามปกติมันยากที่จะตรวจสอบอย่างไม่น่าเชื่อโดยการตรวจสอบด้วยภาพว่าลำดับสองอย่างนั้นเหมือนกัน CTE ช่วยให้คุณสามารถตั้งชื่อค่าด้วยชื่อคอลัมน์ที่พวกเขากำลังจะถูกแทรกเข้าไปซึ่งหมายความว่าคุณสามารถจัดตำแหน่งเหล่านี้อย่างแท้จริงในสองบรรทัด
Tidorith

16

อ๋อ:

WITH tab (
  bla bla
)

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (  BatchID,                                                        AccountNo,
APartyNo,
SourceRowID)    

SELECT * FROM tab

โปรดทราบว่านี่สำหรับ SQL Server ซึ่งรองรับ CTE หลายรายการ:

WITH x AS (), y AS () INSERT INTO z (a, b, c) SELECT a, b, c FROM y

Teradata อนุญาตให้ CTE เดียวเท่านั้นและไวยากรณ์เป็นตัวอย่างของคุณ

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