Programming

SQL: สุดยอด SELECT statement

posted on 23 Mar 2008 17:30 by icedtea in Programming

จะบอกว่าหลังจากโพสเรื่อง "งงๆ" ไปแล้ว 2 เรื่องก็กะว่าจะเปลี่ยนไปโพสเรื่องอื่นๆบ้าง แต่นี่เพิ่งเจอพอดี เลยอดไม่ได้ ไหนๆ ก็ 2 เรื่องไปแล้ว ก็ขออีกโพสก่อนละกัน

คือว่าไปพบเจออีกแล้วครับ ก็คือมีเว็บบอร์ดที่หนึ่งมีคนมาถามขอให้ช่วยลดความซ้ำซ้อนของ update query นี่หน่อย (ซึ่งความจริงแล้วเป็น SELECT statement สงสัยจะงงจัด) ซึ่งมีความยาวเกือบ 700 บรรทัดได้ ผมเองดูแล้วก็เรียกว่าเลิกพยายามจะทำความเข้าใจ

ไปดู query ดังกล่าวกันเอาเองนะครับที่นี่เลย ต้องเรียกว่าสุดยอดจริงๆ

การตอบรับของผู้ใช้รายแรก ตอบอย่างสั้นๆง่ายๆว่า "ไม่ละ ทำเอาเองละกันนะ" (ไม่แน่ ถ้าผมเองก็คงเข้าไปตอบก็คงตอบเหมือนกัน ก็พี่แกถูกจ้างมาทำงาน แต่ให้คนอื่นทำให้ฟรีไปหมดเลยนี่สินะ สะดวกดีเหมือนกันเนอะ ) แต่ก็มีผู้ใช้ใหม่เข้ามาโพสคนหนึ่ง แบบว่าไม่รู้ว่าใช้เวลาขนาดไหน แต่ถึงขั้นดึงข้อมูลเป็นตารางออกมาเรียบร้อย พร้อมเริ่มขั้นตอนอธิบายวิธีการปรับ query ให้ดูเรียบง่ายขึ้นอย่างน่าแปลกตา จนแบบว่าผู้ที่มาตอบคนสุดท้าย ได้ให้ความคิดเห็นว่า เออ หวังว่าผู้ใช้คนนี้เข้ามาตอบโพสของผมนะ หากผมมีคำถามครั้งต่อไป เหอะๆ

ป.ล. สำหรับผู้ที่อ่านแล้วงงอยู่ดี คือว่าการเขียนโค้ดควรจะกระชับ สั้น ได้ใจความ อ่านแล้วเข้าใจติดตามได้ ไม่ควรจะเป็นแบบที่เห็น SELECT อะไรก็ไม่รู้ 600 กว่าบรรทัด มีอะไรผิดสำแดงแล้ว เห็นแล้วสงสารเซิร์ฟเวอร์ตอนรัน

Tags: sql 2 Comments

SQL: If EXISTS Then UPDATE Else INSERT

posted on 21 Mar 2008 10:12 by icedtea in Programming

ในหลายกรณีที่คุณอาจจะต้องเขียน Stored Procedure เพื่อทำหน้าที่ง่ายๆ อย่างตรวจสอบว่ามี record นี้หรือยัง หากมีแล้วให้ทำการ UPDATE หากยังไม่มีให้ทำการ INSERT อย่างกรณีที่ใช้กันไม่ว่าจะสำหรับอัปเดต/เพิ่มสินค้า หรือสถิติก็ตาม

โดยปกติแล้ว ผมเองก็จะเขียนใช้ IF statement อะไรแบบนี้

IF EXISTS (SELECT * FROM Table1 WHERE Column1='something')

    UPDATE Table1 SET (something = something) WHERE Column1='something'

ELSE

    INSERT INTO Table1 VALUES (something, something)

 

วันก่อนเพื่อนที่ทำงานอยู่มาถาม ผมเองก็ให้ความแนะนำแบบนี้ไป หากค้นหาบนอินเทอร์เน็ตตามบอร์ดต่างๆ ก็จะเห็นว่าแนะนำวิธีแบบนี้กัน แต่วันหนึ่งได้ไปอ่านเจอบล็อกนี้พอดี ซึ่งอธิบายถึงแนวทางที่ดีกว่านี้ เลยขอมาเล่าให้ฟังเพราะว่าหลายคนอาจไม่รู้เหมือนกัน

ซึ่งเข้าใจก่อนว่าวิธีเดิมนั้น SQL ต้องเสียเวลาไปค้นหาเพื่อตรวจสอบว่ามี record อยู่หรือเปล่า แต่ถ้าใช้วิธีใหม่แบบนี้:

UPDATE Table1 SET (something = something) WHERE Column1='something'

IF @@ROWCOUNT=0

    INSERT INTO Table1 VALUES (something, something)

 

จะพบว่า SQL ไม่ต้องเสียเวลาค้นหาเลย โดยจะพยายามอัปเดตทันที จากนั้นตรวจสอบว่าอัปเดตได้หรือไม่ด้วยเพียงตรวจค่า ROWCOUNT ไม่ต้องค้นหา จากนั้นหากไม่ได้อัปเดต จึงค่อย INSERT พอผมอ่านจบ บอกว่าค่อนข้างประทับใจเลย เวลารู้สึกได้รู้วิธีอะไรใหม่ๆ ดีกว่าเดิม

ป.ล. ผมเคยมีประสบการณ์จริงที่เคยเขียนแล้วใช้งานจริง โดยเขียนใช้วิธีแรก แต่แล้วคำสั่งอัปเดตผิดพลาดอย่างเป็น .... WHERE DepartmentCode = DepartmentCode แทนที่จะเป็น DepartmentCode = @DepartmentCode เพียงโค้ดผิดเล็กน้อย ทำให้คำสั่งไปอัปเดตซ้ำกัน โดยหลายกรณีควร INSERT ใหม่ พอเห็นแล้วรู้สึกได้โง่เลย จากนั้นต้องมานั่งแก้ไม่ใช่แค่โค้ด แต่รันคำนวณประมวลข้อมูลใหม่อีกด้วย เหอะๆ

Tags: sql 4 Comments