1. ホーム
  2. sql

[解決済み] あるテーブルから、別のテーブルに存在しないレコードを検索する

2022-03-15 09:09:22

質問

以下の2つのテーブルがあります(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 |
+----+------+--------------+

解決方法は?

この方法にはいくつかの種類があり、クエリオプティマイザーの性能と2つのテーブルの相対的なサイズによって効率が異なります。

これは最も短い文であり、電話帳が非常に短い場合、最も速いかもしれません。

SELECT  *
FROM    Call
WHERE   phone_number NOT IN (SELECT phone_number FROM Phone_book)

または、(Issuka) アルターライフ )

SELECT *
FROM   Call
WHERE  NOT EXISTS
  (SELECT *
   FROM   Phone_book
   WHERE  Phone_book.phone_number = Call.phone_number)

または (WOPRに感謝)

SELECT * 
FROM   Call
LEFT OUTER JOIN Phone_Book
  ON (Call.phone_number = Phone_book.phone_number)
  WHERE Phone_book.phone_number IS NULL

(他の人も言っているように、通常は必要なカラムだけを選択するのがベストであり、 ' * ')