subquery
คุณมีในรหัสของคุณเรียกว่าตารางมา มันไม่ใช่ตารางฐาน แต่เป็นตารางที่ "อยู่" ในช่วงเวลาที่แบบสอบถามทำงาน เช่นเดียวกับมุมมอง (ซึ่งเรียกอีกอย่างว่าตารางที่ดู ) - และในCTEรุ่นล่าสุดซึ่งเป็นอีกวิธีที่ 4 ในการ "กำหนด" ตารางภายในแบบสอบถาม - มันคล้ายกับตารางในหลาย ๆ วิธี คุณสามารถselect
จากพวกเขาคุณสามารถใช้พวกเขาในfrom
หรือเพื่อjoin
พวกเขาไปยังตารางอื่น ๆ (ฐานหรือไม่!)
ใน DBMS บางตัว (ไม่ใช่ DBMS ทั้งหมดที่ใช้วิธีนี้เหมือนกัน) ตาราง / มุมมองเหล่านี้สามารถอัปเดตได้ และ "ปรับปรุงได้" หมายความว่าเราสามารถยังupdate
, insert
เข้าหรือdelete
จากพวกเขา
มีข้อ จำกัด อยู่และคาดว่าจะเป็นเช่นนี้ ลองคิดดูว่าการsubquery
เข้าร่วมเป็น 2 (หรือ 17 ตาราง) ถ้าเช่นdelete
นั้นจะหมายความว่าอย่างไร (จากตารางที่ควรแถวถูกลบ?) มองเห็นวิวปรับปรุงได้เป็นเรื่องที่มีความซับซ้อนมาก มีที่ผ่านมา (2012) หนังสือทั้งหมดในเรื่องนี้ที่เขียนโดยคริสวันที่ผู้เชี่ยวชาญที่รู้จักกันดีในทฤษฎีความสัมพันธ์เป็น: ดูการอัปเดตและทฤษฎีสัมพันธ์
เมื่อตารางที่ได้รับ (หรือมุมมอง) เป็นแบบสอบถามที่ง่ายมากเช่นมีเพียงตารางฐานเดียว (อาจถูก จำกัด โดย a WHERE
) และไม่ใช่GROUP BY
จากนั้นทุกแถวของตารางที่ได้รับจะสอดคล้องกับหนึ่งแถวในตารางฐานที่อยู่ข้างใต้ดังนั้นจึงเป็น ง่าย*เพื่ออัปเดตแทรกหรือลบจากสิ่งนี้
เมื่อรหัสภายในแบบสอบถามย่อยมีความซับซ้อนมากกว่านั้นขึ้นอยู่กับว่าแถวของตาราง / มุมมองที่ได้รับนั้นสามารถสืบหา / แก้ไขไปยังแถวจากหนึ่งในตารางฐานพื้นฐานได้หรือไม่
สำหรับ SQL Server คุณสามารถอ่านเพิ่มเติมในวรรคชมปรับปรุงได้ใน CREATE VIEW
MSDN:
มุมมองที่อัปเดตได้
คุณสามารถปรับเปลี่ยนข้อมูลของตารางพื้นฐานผ่านมุมมองตราบใดที่เงื่อนไขต่อไปนี้เป็นจริง:
การปรับเปลี่ยนใด ๆ รวมทั้งUPDATE
, INSERT
และDELETE
งบคอลัมน์อ้างอิงต้องเริ่มต้นเพียงตารางฐานหนึ่ง
คอลัมน์ที่กำลังแก้ไขในมุมมองจะต้องอ้างอิงข้อมูลพื้นฐานในคอลัมน์ตารางโดยตรง คอลัมน์ไม่สามารถรับได้ด้วยวิธีอื่นเช่นผ่านต่อไปนี้:
ฟังก์ชันการรวม: AVG
, COUNT
, SUM
, MIN
, MAX
, GROUPING
, STDEV
, STDEVP
, VAR
และVARP
และ
การคำนวณ คอลัมน์ไม่สามารถคำนวณได้จากนิพจน์ที่ใช้คอลัมน์อื่น คอลัมน์ที่จะเกิดขึ้นโดยใช้ประกอบชุดUNION
, UNION ALL
, CROSSJOIN
, EXCEPT
และINTERSECT
จำนวนเงินเพื่อการคำนวณและจะยังไม่สามารถปรับปรุง
คอลัมน์การแก้ไขจะไม่ได้รับผลกระทบจากGROUP BY
, HAVING
หรือDISTINCT
คำสั่ง
TOP
ไม่ได้ใช้ที่ใดก็ได้ใน select_statement ของมุมมองพร้อมกับส่วนWITH CHECK OPTION
คำสั่ง
ข้อ จำกัด ก่อนหน้านี้นำไปใช้กับแบบสอบถามย่อยใด ๆ ในFROM
ส่วนของมุมมองเช่นเดียวกับที่ใช้กับมุมมองตัวเอง โดยทั่วไปแล้ว Database Engine จะต้องสามารถติดตามการแก้ไขจากนิยามการดูไปยังตารางฐานเดียวอย่างไม่น่าสงสัย
ที่จริงdelete
เป็นเรื่องง่าย, update
ซับซ้อนน้อยกว่า SQL Server ต้องการคีย์หลักหรือวิธีอื่นเพื่อระบุแถวของตารางฐานที่จะถูกลบ สำหรับupdate
มีข้อ จำกัด เพิ่มเติม (ค่อนข้างชัดเจน) ว่าเราไม่สามารถอัปเดตคอลัมน์ที่คำนวณได้ คุณสามารถลองปรับเปลี่ยนแบบสอบถามเพื่อทำการอัพเดท การอัปเดตCreatedDateTime
อาจจะใช้ได้ แต่การพยายามอัปเดตRowNumber
คอลัมน์ที่คำนวณแล้วจะทำให้เกิดข้อผิดพลาด และinsert
มีความซับซ้อนมากขึ้นเนื่องจากเราต้องระบุค่าสำหรับคอลัมน์ทั้งหมดของตารางฐานที่ไม่มีDEFAULT
ข้อ จำกัด