ฉันคิดว่าปัญหาหลักคือฐานข้อมูลบางส่วนไม่สนับสนุน Common Table Expressions
นายจ้างของฉันใช้ DB / 2 เพื่อหลายสิ่งหลายอย่าง เวอร์ชันล่าสุดรองรับ CTE เช่นที่ฉันสามารถทำสิ่งต่าง ๆ เช่น:
with custs as (
select acct# as accountNumber, cfname as firstName, clname as lastName,
from wrdCsts
where -- various criteria
)
, accounts as (
select acct# as accountNumber, crBal as currentBalance
from crzyAcctTbl
)
select firstName, lastName, currentBalance
from custs
inner join accounts on custs.accountNumber = accounts.accountNumber
ผลก็คือเราสามารถมีชื่อตาราง / ฟิลด์ที่ยากมากและฉันกำลังสร้างมุมมอง temp ด้วยชื่อที่อ่านง่ายขึ้นซึ่งฉันสามารถใช้ แน่นอนว่าแบบสอบถามจะใช้เวลานานขึ้น แต่ผลลัพธ์คือฉันสามารถเขียนสิ่งที่แยกออกมาได้ค่อนข้างชัดเจน (ใช้ CTE ในแบบที่คุณใช้ฟังก์ชั่นในการรับ DRY) และจบลงด้วยรหัสที่อ่านง่าย และเนื่องจากฉันสามารถแยกย่อยแบบสอบถามย่อยของฉันและมีคิวรีย่อยหนึ่งอ้างอิงอีกคิวจึงไม่ใช่ "อินไลน์" ทั้งหมด ในบางครั้งฉันได้เขียน CTE หนึ่งรายการจากนั้นมี CTE อื่น ๆ ทั้งหมดสี่รายการอ้างอิงทั้งหมดจากนั้นให้ผลลัพธ์หลักของการรวมแบบสอบถามสี่รายการสุดท้าย
สามารถทำได้ด้วย:
- DB / 2
- PostgreSQL
- คำพยากรณ์
- เซิร์ฟเวอร์ MS SQL
- MySQL (เวอร์ชั่นล่าสุดยังค่อนข้างใหม่)
- อาจอื่น ๆ
แต่มันเป็นวิธีที่ยาวไปสู่การทำความสะอาดโค้ดอ่านง่ายและแห้งมากขึ้น
ฉันได้พัฒนา "ไลบรารีมาตรฐาน" ของ CTEs ที่ฉันสามารถปลั๊กอินไปยังคิวรีต่าง ๆ ทำให้ฉันเริ่มการค้นหาใหม่ได้ทันที บางส่วนของพวกเขาเริ่มที่จะกอดโดย devs อื่น ๆ ในองค์กรของฉันเช่นกัน
ในบางครั้งอาจทำให้การเปลี่ยนบางส่วนเป็นมุมมองเช่น "ไลบรารี่มาตรฐาน" นี้พร้อมใช้งานโดยไม่จำเป็นต้องคัดลอก / วาง แต่ CTE ของฉันได้รับการปรับแต่งเล็กน้อยดังนั้นสำหรับความต้องการต่าง ๆ ที่ฉันไม่สามารถใช้ CTE เดียวได้ใช้ SO WIDELY โดยไม่มี mods ซึ่งอาจคุ้มค่าในการสร้างมุมมอง
ดูเหมือนว่าส่วนหนึ่งของมือจับของคุณคือ "ทำไมฉันถึงไม่รู้เกี่ยวกับ CTEs" หรือ "ทำไมฐานข้อมูลของฉันไม่รองรับ CTE"
สำหรับการอัปเดต ... ใช่คุณสามารถใช้ CTEs ได้ แต่จากประสบการณ์ของฉันคุณต้องใช้มันในส่วนคำสั่งชุดและในส่วนคำสั่งที่ มันจะดีถ้าคุณสามารถกำหนดหนึ่งหรือมากกว่าข้างหน้าของคำสั่งการปรับปรุงทั้งหมดแล้วเพียงแค่มีส่วน "หลักแบบสอบถาม" ในชุด / สถานที่ที่คำสั่ง แต่มันไม่ทำงานอย่างนั้น และไม่มีการหลีกเลี่ยงชื่อตาราง / ฟิลด์ที่คลุมเครือบนตารางที่คุณกำลังอัปเดต
คุณสามารถใช้ CTE เพื่อลบได้ อาจใช้หลาย CTE เพื่อกำหนดค่า PK / FK สำหรับบันทึกที่คุณต้องการลบจากตารางนั้น อีกครั้งคุณไม่สามารถหลีกเลี่ยงการปิดบังชื่อตาราง / ฟิลด์บนตารางที่คุณกำลังแก้ไข
ตราบเท่าที่คุณสามารถเลือกลงในส่วนแทรกคุณสามารถใช้ CTEs สำหรับส่วนแทรกได้ เช่นเคยคุณอาจต้องเผชิญกับชื่อตาราง / ฟิลด์ที่ไม่ชัดเจนบนตารางที่คุณกำลังแก้ไข
SQL ไม่อนุญาตให้คุณสร้างรายการเทียบเท่าของวัตถุโดเมน, ตัดตาราง, ด้วย getters / setters สำหรับสิ่งนั้นคุณจะต้องใช้ ORM บางชนิดพร้อมกับภาษาโปรแกรม / OO ขั้นตอนเพิ่มเติม ฉันเขียนสิ่งนี้ใน Java / Hibernate