SQL สำหรับกรณี … ถ้าไม่มีให้ Insert ถ้ามีให้ Update ถ้าเกินให้ Delete

บางครั้งเรามีข้อมูลอยู่ชุดหนึ่ง อยากจะ insert เข้าตาราง แต่จะสั่ง insert เลยเราก็ไม่แน่ใจว่าจะมี key ของบางเรคคอร์ดอยู่ในตารางปลายทางอยู่แล้วหรือเปล่า เพราะถ้ามีข้อมูลซ้ำกันแม้แต่เรคคอร์ดเดียวก็จะเกิด primary key violation และทำให้ insert ไม่สำเร็จ เราอยากให้มันดูเป็นรายบรรทัดได้ว่าปลายทางมี key นั้นๆ หรือยัง หากยังไม่มีจึงจะให้ insert หากมีอยู่แล้วก็ให้ update การดำเนินการลักษณะนี้เราเรียกว่าการ upsert (มาจากคำว่า update + insert) คือสามารถที่จะเลือก insert หรือ update ได้ตามแต่ว่าตารางปลายทางมี key นั้นอยู่แล้วหรือไม่
Read the rest of this entry »

SQL Query ในการดึงข้อมูลที่มีโครงสร้างเป็นแบบ hierarchy

สำหรับข้อมูลที่มีโครงสร้างเป็นแบบ hierarchy หรือโครงสร้างต้นไม้ เช่นผังองค์กร, สายบังคับบัญชา มักจะมีการตั้งคำถามว่า หน่วยงานนี้อยู่ในสังกัดหน่วยงานอะไรบ้าง หรือมีพนักงานคนใดอยู่ภายใต้การบังคับบัญชาของผู้จัดการคนนี้บ้าง เทคนิคการ query เพื่อหาคำตอบสำหรับข้อมูลแบบนี้ต้องใช้การเวียนเกิดหรือ recursion
Read the rest of this entry »

วิธีเขียน Query เพื่อ Select Top N ของ Group

สมมติว่าเรามีข้อมูลเป็นตาราง Customer ซึ่งมีฟิลด์ credit เป็นข้อมูลเครดิตลูกค้า และฟิลด์ province ซึ่งบอกจังหวัดของลูกค้า
เราอาจจะรู้วิธีเขียน query เพื่อดึงคนที่มีเครดิตสูงสุด N ลำดับแรกออกมา (Top N)
เราอาจจะรู้วิธีทำ aggregation บางอย่าง เช่นหาค่า Min, Max หรือ Average ของแต่ละกลุ่ม(ในที่นี้คือจังหวัด) ออกมา
แต่ถ้าโจทย์ของเราคือ หา Top N ของแต่ละกลุ่มออกมาล่ะ?
Read the rest of this entry »

การทำ Pivot Table กลาง Query ด้วย SQL Server 2005

Pivot Table หมายถึงลักษณะของตารางที่แสดงข้อมูลในเชิงวิเคราะห์ (Analytic) ไม่ใช่ข้อมูลดิบแบบ Transaction
จุดเด่นที่สังเกตได้ก็คือคอลัมน์ของ Pivot Table จะไม่ตายตัว แต่จะได้มาจากตัวเนื้อข้อมูล ต่างกับ Table ธรรมดา
ที่มักจะ fix คอลัมน์ไว้แล้วว่าประกอบด้วยข้อมูลอะไรบ้าง และตัวเลขใน Pivot Table ก็มักจะเป็นค่าที่สามารถวัดผล (Measure) ได้
โดยมากมักจะเป็นค่าที่เกิดจาก Aggregate function อย่างเช่น Sum, Avg, Max, Min เป็นต้น
Read the rest of this entry »

การ Update หรือ Delete โดย Join เงื่อนไขจากตารางอื่น

ถ้าเราต้องมีการ update หรือ delete ข้อมูลในฐานข้อมูลคราวละหลาย record ด้วยเงื่อนไขบางอย่าง ถ้าเป็นไปได้ควรจะเขียนให้ทำงานได้ด้วยคำสั่ง SQL Command เดียว หากเงื่อนไขนั้นอยู่ในตารางที่ต้องการจะลบอยู่แล้ว SQL Command ก็จะตรงไปตรงมา อย่างเช่นคำสั่ง update ก็จะเป็นประมาณนี้
Read the rest of this entry »

ทำ Paging ง่ายๆ กับ Linq to SQL

คราวก่อนผมได้พูดถึงฟังค์ชั่น ROW_NUMBER ของ SQL Server 2005 ซึ่งเป็นตัวสำคัญในการทำ paging
ในทางปฏิบัติแล้ว ถ้าเราใช้ Linq to SQL เราไม่จำเป็นต้องเขียน SQL ซับซ้อนขนาดนั้นก็ได้
Read the rest of this entry »

ROW_NUMBER() ฟังค์ชั่นใหม่ใน SQL Server 2005

(post นี้เอามาจากที่เคย post ไว้ที่ bloggang เมื่อนานมาแล้ว แต่ตอนนี้จะย้ายนิวาสมาอยู่ wordpress แล้ว)
สมหวังกันแล้วครับคราวนี้ ในที่สุด sql server ก็มีฟังค์ชั่น row_number() ไว้สำหรับบอกหมายเลขบรรทัดของการ query
ทีนี้เราก็จะสามารถทำ paging ให้กับ query ได้ซะที ว่าที่จริงมันก็ไม่ใช่เรื่องใหม่อะไร MySql เค้าทำ limit ได้มาตั้งนานแล้ว
Oracle ก็มี RowId ให้ใช้มานานแล้วเหมือนกัน
Read the rest of this entry »