วิธีการสร้าง Temp table SQL
การสร้าง Temp table SQL เพื่อช่วยแก้ปัญหา Query ที่ต้องการ Where ด้วยชุดข้อมูลจำนวนมาก ทำให้บางครั้งใช้เวลาในการ Execute result นานมาก
สามารถแก้ไขได้ ด้วยวิธีการสร้าง Temp table ขึ้นมารองรับข้อมูลจำนวนหนึ่งก่อน นำไป Join กับข้อมูลอีกชุดนึง เช่น
มีข้อมูลห้องสมุดแห่งหนึ่งดังนี้
Table Library
Table Users
Table Blacklists
โจทย์คือ เราต้องการจะหาว่ามีหนังสืออะไรบ้าง ที่คนติด Blacklist ยืมไป
- จากที่เราอาจจะต้อง Join ข้อมูลทั้งสาม Table
เราสามารถ หาข้อมูลของ User ที่ติด Blacklist และเก็บไว้ใน Temp table ก่อน แล้วนำไป Join กับ Table Library เพื่อหาหนังสือได้ดังนี้
CREATE TABLE #tempUsers
(
ClientID BIGINT
)
INSERT INTO #tempUsers
SELECT ClientID FROM Users u
JOIN Blacklists b ON u.ClientID = b.ID
WHERE ISNULL(u.IsActive, 'Y')='Y'
จาก Query ข้างต้นจะทำให้เราได้ข้อมูล Id ของ User ทั้งหมดที่ติด Blacklist
Table #tempUsers
จากนี้ก็ง่ายแล้วครับ
เราแค่นำ Temp table #tempUsers ไป Join กับ Table Library
SELECT BookID, TitleBook FROM Library l
JOIN #tempUsers u ON l.BorrowPersonId = u.ClientID
WHERE ISNULL([Having], 'Y')='Y'
เราก็จะได้รายชื่อหนังสือทั้งหมด ที่คนติด Blacklist ยืมไปแล้วครับ
แล้วอย่าลืมลบ Temp table หลังจากใช้งานเรียบร้อยแล้วนะครับ
drop table #tempUsers
แค่นี้เราลดการซับซ้อนของการ Query ได้แล้วครับ ง่ายทั้งวิธีคิด และทำให้โปรแกรม Execute รวดเร็วขึ้นอีกด้วย (ยิ่งถ้ามีจำนวนข้อมูลเป็นหลัก แสน หรือ ล้าน แค่ใช้วิธีนี้ก็ลดการซับซ้อนของการ Query ได้มากเลยครับ)
หรือถ้าเรากลัวจะลืมขั้นตอนการลบ Temp table เราสามารถเลือกใช้ตัวแปรมาเก็บ Result แทนได้ ดังนี้
DECLARE @tempUsers TABLE
(
ClientID BIGINT
)
INSERT INTO #tempUsers
SELECT ClientID FROM Users u
JOIN Blacklists b ON u.ClientID = b.ID
WHERE ISNULL(u.IsActive, 'Y')='Y'
จะได้ผลลัพธ์เหมือนกับ Temp table เลยครับ
แต่ต่างกันตรงที่ การสร้าง Temp table จะเกิด Table ขึ้นมาจริงๆ (ต้องมีการลบ Table เพื่อ Clear Table ที่เราสร้างขึ้นมาชั่วคราวด้วย)
แต่การประกาศตัวแปรเป็น Table เพื่อมาเก็บ Result
DECLARE @variable TABLE
จะได้แค่ Result ของการ Query ที่ถูกใส่ไว้ในตัวแปรในรูปแบบ Table ครับ (ไม่ต้องลบตัวแปร เราสามารถใช้งานต่อได้เลย โดยสามารถใส่ Result table อื่นๆ ลงในไปในตัวแปรได้เลยครับ
** เพิ่มเติม เราสามารถ Query check ข้อมูล Null ได้ในกรณีที่มีข้อมูลอื่นๆ ปะปนอยู่ด้วย ทำได้โดยการ
SELECT * FROM Users WHERE ISNULL(IsActive, 'Y')='Y'
เมื่อเราต้องการหาเฉพาะข้อมูลที่ยัง Active อยู่ รวมทั้งข้อมูลที่เป็น Null ด้วย
เราจะ Check null ด้วยคำสั่งนี้
ISNULL(Column ที่สนใจ, ค่าที่ต้องการเปลี่ยนเมื่อข้อมูลเป็น null)
จาก Query ดังกล่าวจะเปลี่ยนค่า Null ใน Column IsActive เป็น Y และเลือกข้อมูลเฉพาะที่เป็น Y ผลลัพธ์จะได้ดังนี้ครับ