Saya punya dua tabel SQL berikut (di MySQL):
Phone_book
+----+------+--------------+
| id | name | phone_number |
+----+------+--------------+
| 1 | John | 111111111111 |
+----+------+--------------+
| 2 | Jane | 222222222222 |
+----+------+--------------+
Call
+----+------+--------------+
| id | date | phone_number |
+----+------+--------------+
| 1 | 0945 | 111111111111 |
+----+------+--------------+
| 2 | 0950 | 222222222222 |
+----+------+--------------+
| 3 | 1045 | 333333333333 |
+----+------+--------------+
Bagaimana cara mengetahui panggilan mana yang dilakukan oleh orang-orang yang phone_number
tidak masuk Phone_book
? Output yang diinginkan adalah:
Call
+----+------+--------------+
| id | date | phone_number |
+----+------+--------------+
| 3 | 1045 | 333333333333 |
+----+------+--------------+
Bantuan apa pun akan sangat dihargai.
SELECT *
di subquery. Sebaliknya, misalnyaSELECT 1
, harus cukup cantik.Harus menghapus subquery, memungkinkan pengoptimal kueri untuk melakukan keajaibannya.
Selain itu, hindari "SELECT *" karena dapat merusak kode Anda jika seseorang mengubah tabel atau tampilan yang mendasarinya (dan itu tidak efisien).
sumber
1:N
hubungan antara dua tabel Anda. ATAU tambahkanDISTINCT
seperti terlihat dalam jawaban VladoKode di bawah ini akan sedikit lebih efisien daripada jawaban yang disajikan di atas ketika berhadapan dengan kumpulan data yang lebih besar.
sumber
Call
, jika ada beberapa baris yang cocokPhone_book
. Artinya, jika ada1:N
hubungan antara dua tabel Anda.LEFT OUTER JOIN
, lihat apakah kinerjanya lebih baik.Ini akan mengembalikan id tambahan yang hilang di tabel Phone_book Anda.
sumber
kupikir
sumber
id
kolom dalamcall
tabel tidak nilai yang sama sebagaiid
kolom dalamPhone_book
tabel, sehingga Anda tidak dapat bergabung pada nilai-nilai ini. Lihat jawaban WOPR untuk pendekatan serupa.sumber
sumber
Kalau tidak,
sumber