sql-从一个表中查找另一个表中不存在的记录

krugob8w  于 2021-06-20  发布在  Mysql
关注(0)|答案(8)|浏览(465)

我有以下两个sql表(在mysql中):

  1. Phone_book
  2. +----+------+--------------+
  3. | id | name | phone_number |
  4. +----+------+--------------+
  5. | 1 | John | 111111111111 |
  6. +----+------+--------------+
  7. | 2 | Jane | 222222222222 |
  8. +----+------+--------------+
  9. Call
  10. +----+------+--------------+
  11. | id | date | phone_number |
  12. +----+------+--------------+
  13. | 1 | 0945 | 111111111111 |
  14. +----+------+--------------+
  15. | 2 | 0950 | 222222222222 |
  16. +----+------+--------------+
  17. | 3 | 1045 | 333333333333 |
  18. +----+------+--------------+

我如何找出哪些电话是由 phone_number 不在 Phone_book ? 所需输出为:

  1. Call
  2. +----+------+--------------+
  3. | id | date | phone_number |
  4. +----+------+--------------+
  5. | 3 | 1045 | 333333333333 |
  6. +----+------+--------------+

任何帮助都将不胜感激。

um6iljoc

um6iljoc1#

有几种不同的方法可以做到这一点,效率各不相同,这取决于您的查询优化程序有多好,以及两个表的相对大小:
这是最短的语句,如果您的电话簿很短,这可能是最快的语句:

  1. SELECT *
  2. FROM Call
  3. WHERE phone_number NOT IN (SELECT phone_number FROM Phone_book)

或者(感谢alterlife)

  1. SELECT *
  2. FROM Call
  3. WHERE NOT EXISTS
  4. (SELECT *
  5. FROM Phone_book
  6. WHERE Phone_book.phone_number = Call.phone_number)

或(感谢wopr)

  1. SELECT *
  2. FROM Call
  3. LEFT OUTER JOIN Phone_Book
  4. ON (Call.phone_number = Phone_book.phone_number)
  5. WHERE Phone_book.phone_number IS NULL

(忽略这一点,正如其他人所说,通常最好只选择所需的列,而不是 * ')

展开查看全部
k5ifujac

k5ifujac2#

或者,

  1. select id from call
  2. minus
  3. select id from phone_number
e37o9pze

e37o9pze3#

我想

  1. SELECT CALL.* FROM CALL LEFT JOIN Phone_book ON
  2. CALL.id = Phone_book.id WHERE Phone_book.name IS NULL
h7wcgrx3

h7wcgrx34#

  1. SELECT name, phone_number FROM Call a
  2. WHERE a.phone_number NOT IN (SELECT b.phone_number FROM Phone_book b)
hsgswve4

hsgswve45#

  1. SELECT Call.ID, Call.date, Call.phone_number
  2. FROM Call
  3. LEFT OUTER JOIN Phone_Book
  4. ON (Call.phone_number=Phone_book.phone_number)
  5. WHERE Phone_book.phone_number IS NULL

应该删除子查询,允许查询优化程序发挥其魔力。
另外,避免使用“select*”,因为如果有人修改底层的表或视图,它会破坏代码(而且效率很低)。

o75abkj4

o75abkj46#

  1. SELECT t1.ColumnID,
  2. CASE
  3. WHEN NOT EXISTS( SELECT t2.FieldText
  4. FROM Table t2
  5. WHERE t2.ColumnID = t1.ColumnID)
  6. THEN t1.FieldText
  7. ELSE t2.FieldText
  8. END FieldText
  9. FROM Table1 t1, Table2 t2
uxhixvfz

uxhixvfz7#

当处理更大的数据集时,下面的代码将比上面给出的答案更有效率。

  1. SELECT * FROM Call WHERE
  2. NOT EXISTS (SELECT 'x' FROM Phone_book where
  3. Phone_book.phone_number = Call.phone_number)
vsaztqbk

vsaztqbk8#

  1. SELECT DISTINCT Call.id
  2. FROM Call
  3. LEFT OUTER JOIN Phone_book USING (id)
  4. WHERE Phone_book.id IS NULL

这将返回电话簿表中丢失的额外id。

相关问题