Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

เราจะแปลงแบบสอบถามย่อยเป็น INNER JOIN ได้อย่างไร


เพื่อให้เข้าใจว่าเรากำลังใช้ข้อมูลจากตารางต่อไปนี้ -

mysql> Select * from customers;
+-------------+----------+
| Customer_Id | Name     |
+-------------+----------+
|           1 | Rahul    |
|           2 | Yashpal  |
|           3 | Gaurav   |
|           4 | Virender |
+-------------+----------+
4 rows in set (0.00 sec)

mysql> Select * from reserve;
+------+------------+
| ID   | Day        |
+------+------------+
|    1 | 2017-12-30 |
|    2 | 2017-12-28 |
|    2 | 2017-12-25 |
|    1 | 2017-12-24 |
|    3 | 2017-12-26 |
+------+------------+
5 rows in set (0.00 sec)

ต่อไปนี้เป็นแบบสอบถามย่อยที่จะค้นหาชื่อของลูกค้าทั้งหมดที่จองรถไว้

mysql> Select Name from customers WHERE customer_id IN (Select id from reserve);
+----------+
| Name     |
+----------+
| Rahul    |
| Yashpal  |
| Gaurav   |
+----------+
3 rows in set (0.00 sec)

ตอนนี้ ด้วยความช่วยเหลือของขั้นตอนต่อไปนี้ เราสามารถแปลงแบบสอบถามย่อยด้านบนเป็นการเข้าร่วมภายใน -

  • ย้ายตาราง 'สำรอง' ที่มีชื่ออยู่ในข้อความค้นหาย่อยไปยังส่วนคำสั่ง FROM

  • ส่วนคำสั่ง WHERE จะเปรียบเทียบคอลัมน์ customer_id กับรหัสที่ส่งคืนจากเคียวรีย่อย

ด้วยเหตุนี้จึงแปลงนิพจน์เป็นการเปรียบเทียบโดยตรงอย่างชัดเจนระหว่างคอลัมน์รหัสของสองตาราง

mysql> SELECT Name from customers, reserve WHERE customer_id = id;
+----------+
| Name     |
+----------+
| Rahul    |
| Yashpal  |
| Yashpal  |
| Rahul    |
| Gaurav   |
+----------+
5 rows in set (0.00 sec)

ดังที่เราเห็นได้ว่าผลลัพธ์ด้านบนไม่เหมือนกับผลลัพธ์ของ subquery ทุกประการ ดังนั้นให้ใช้คีย์เวิร์ด DISTINCT เพื่อให้ได้ผลลัพธ์ที่เหมือนกันดังนี้:

mysql> SELECT DISTINCT name from customers,reserve WHERE customer_id = id;
+----------+
| Name     |
+----------+
| Rahul    |
| Yashpal  |
| Gaurav   |
+----------+
3 rows in set (0.03 sec)