У меня есть следующие две таблицы SQL (в 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 |
+----+------+--------------+
Как мне узнать, какие звонки были сделаны людьми, которых phone_number
нет в Phone_book
? Желаемый результат будет:
Call
+----+------+--------------+
| id | date | phone_number |
+----+------+--------------+
| 3 | 1045 | 333333333333 |
+----+------+--------------+
Любая помощь приветствуется.
SELECT *
в подзапросе. Вместо этого, напримерSELECT 1
, должно быть достаточно.Следует удалить подзапрос, позволяющий оптимизатору запросов работать со своей магией.
Также избегайте «SELECT *», потому что он может сломать ваш код, если кто-то изменит базовые таблицы или представления (и это неэффективно).
источник
1:N
между вашими двумя таблицами есть связь. Или добавить ,DISTINCT
как показано в ответ Владо поПриведенный ниже код будет немного более эффективным, чем ответы, представленные выше, при работе с большими наборами данных.
источник
Call
, если в нем есть несколько совпадающих строкPhone_book
. То есть, если есть1:N
связь между вашими двумя таблицами.LEFT OUTER JOIN
, посмотрите, лучше ли его производительность.Это вернет дополнительные идентификаторы, которые отсутствуют в вашей таблице Phone_book.
источник
думаю
источник
id
Столбец вcall
таблице не то же самое значение, что иid
столбец вPhone_book
таблице, так что вы не можете присоединиться на эти ценности. Смотрите ответ WOPR для аналогичного подхода.источник
источник
С другой стороны,
источник