วิธีการสร้าง Temp table SQL

Mr.Rukpong
Arcadia Software Development
3 min readDec 9, 2018

การสร้าง 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 ผลลัพธ์จะได้ดังนี้ครับ

--

--