หาค่าที่ตรงเงื่อนไขหลายอย่างในแถวต่างกัน (Relational Division)
โจทย์: หา FirstRow ที่มี SecondRow ครบทุกค่าในชุด (10, 100, 300)
รูปแบบคำสั่ง (Syntax)
SELECT yourColumnName1
FROM yourTableName
WHERE yourColumnName2 IN (value1, value2, ...)
GROUP BY yourColumnName1
HAVING COUNT(DISTINCT yourColumnName2) = number_of_values;
ตัวอย่างการใช้งาน
สร้างตาราง DifferentRows:
CREATE TABLE DifferentRows (
FirstRow INT,
SecondRow INT
);
INSERT INTO DifferentRows VALUES
(10, 10), (10, 100), (10, 300), (20, 100);
ข้อมูล:
| FirstRow | SecondRow |
|---|---|
| 10 | 10 |
| 10 | 100 |
| 10 | 300 |
| 20 | 100 |
หา FirstRow ที่มี SecondRow ครบ 10, 100, 300:
SELECT FirstRow
FROM DifferentRows
WHERE SecondRow IN (10, 100, 300)
GROUP BY FirstRow
HAVING COUNT(DISTINCT SecondRow) = 3;
ผลลัพธ์:
| FirstRow |
|---|
| 10 |
อธิบายตรรกะ
WHERE SecondRow IN (10,100,300)- กรองเฉพาะแถวที่ SecondRow อยู่ในชุดเป้าหมายGROUP BY FirstRow- จับกลุ่มตาม FirstRowHAVING COUNT(DISTINCT SecondRow) = 3- กลุ่มไหนมีค่า SecondRow ครบ 3 ค่าที่ต้องการ (Distinct กันนับซ้ำ)
การประยุกต์: หานักเรียนที่เรียนวิชาครบทุกวิชาที่กำหนด
SELECT student_id
FROM enrollments
WHERE course_id IN ('MATH101', 'PHYS101', 'CHEM101')
GROUP BY student_id
HAVING COUNT(DISTINCT course_id) = 3;
Pattern นี้เรียกว่า Relational Division ใช้แก้ปัญหา "Find entities that have ALL of a set of attributes"