บริษัท B ต้องการค้นหาข้อมูลลูกค้าที่เคยซื้อสินค้ากลุ่ม A แต่ไม่เคยซื้อสินค้ากลุ่ม B เลย วิธีการออกแบบ SQL Query ใดต่อไปนี้เหมาะสมที่สุดสำหรับความต้องการดังกล่าว
กใช้ INNER JOIN ระหว่างตารางลูกค้าและตารางการซื้อสินค้ากลุ่ม A และกลุ่ม B แล้วกรองด้วย WHERE เพื่อหาลูกค้าที่ปรากฏในทั้ง 2 กลุ่ม
ขใช้ EXISTS เพื่อตรวจสอบการซื้อกลุ่ม A และใช้ NOT EXISTS เพื่อกรองลูกค้าที่ไม่มีประวัติการซื้อสินค้ากลุ่ม B ออกจากผลลัพธ์
คใช้ LEFT JOIN ระหว่างตารางสินค้ากลุ่ม A และกลุ่ม B โดยกรองเฉพาะแถวที่ค่าในกลุ่ม B เป็น NULL เพื่อหาความแตกต่างของทั้ง 2 กลุ่ม
งใช้ UNION ALL รวมผลลัพธ์จากการค้นหาลูกค้าในกลุ่ม A และกลุ่ม B แล้วนับจำนวนซ้ำเพื่อระบุลูกค้าที่ซื้อเฉพาะกลุ่ม A
เฉลยอธิบาย
การใช้ EXISTS ร่วมกับ NOT EXISTS เป็นวิธีที่เหมาะสมที่สุด เพราะ EXISTS ตรวจสอบว่าลูกค้ามีประวัติซื้อสินค้ากลุ่ม A จริงหรือไม่ และ NOT EXISTS กรองลูกค้าที่ไม่เคยซื้อสินค้ากลุ่ม B ออกอย่างชัดเจนและมีประสิทธิภาพ ตัวเลือก A ผิดเพราะ INNER JOIN จะดึงเฉพาะลูกค้าที่ซื้อทั้ง 2 กลุ่ม ตัวเลือก C ผิดเพราะ LEFT JOIN บน JOIN ตารางสินค้าไม่ใช่ตารางลูกค้า ทำให้ผลลัพธ์ไม่ตรงโจทย์ ตัวเลือก D ผิดเพราะ UNION ALL รวมข้อมูลซ้ำและต้องนับจำนวนเพิ่มเติม ซึ่งไม่ใช่วิธีที่มีประสิทธิภาพและอาจให้ผลลัพธ์ผิดพลาด