복붙노트

[SQL] SQL - 다른 존재하지 않는 하나 개의 테이블에서 찾기 기록

SQL

SQL - 다른 존재하지 않는 하나 개의 테이블에서 찾기 기록

나는 (MySQL은) 다음과 같은 두 가지 SQL 테이블을 가지고 :

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 |
+----+------+--------------+

어떤 도움이 많이 주시면 감사하겠습니다.

해결법

  1. ==============================

    1.효율성을 다양한 쿼리 최적화이며, 당신의 두 테이블의 상대적 크기 얼마나 좋은에 따라이 일을 여러 가지 방법이있다 :

    효율성을 다양한 쿼리 최적화이며, 당신의 두 테이블의 상대적 크기 얼마나 좋은에 따라이 일을 여러 가지 방법이있다 :

    전화 번호부가 매우 짧은 경우이 가장 짧은 문장이며, 빠른을 할 수있다 :

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

    양자 택일 (Alterlife 덕분에)

    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
    

    (다른 사람이 말했듯이 '*'당신이 원하는 바로 열 수 없습니다를 선택하는 일반적으로 가장 좋은, 그 무시)

  2. ==============================

    2.

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

    쿼리 최적화가 마법을 할 수 있도록 하위 쿼리를 제거해야합니다.

    그것은 당신의 암호를 해독 할 수 있기 때문에, 피할 "SELECT *"만약 누군가가 달라져 기본 테이블이나 뷰 (그리고 비효율적).

  3. ==============================

    3.아래의 코드는 더 큰 데이터 세트를 처리 할 때 위에서 제시 한 답변보다 약간 더 효율적인 것입니다.

    아래의 코드는 더 큰 데이터 세트를 처리 할 때 위에서 제시 한 답변보다 약간 더 효율적인 것입니다.

    SELECT * FROM Call WHERE 
    NOT EXISTS (SELECT 'x' FROM Phone_book where 
    Phone_book.phone_number = Call.phone_number)
    
  4. ==============================

    4.

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

    이것은 당신의 Phone_book 테이블에 누락 된 추가 ID-S를 반환합니다.

  5. ==============================

    5.내 생각

    내 생각

    SELECT CALL.* FROM CALL LEFT JOIN Phone_book ON 
    CALL.id = Phone_book.id WHERE Phone_book.name IS NULL
    
  6. ==============================

    6.

    SELECT t1.ColumnID,
    CASE 
        WHEN NOT EXISTS( SELECT t2.FieldText  
                         FROM Table t2 
                         WHERE t2.ColumnID = t1.ColumnID) 
        THEN t1.FieldText
        ELSE t2.FieldText
    END FieldText       
    FROM Table1 t1, Table2 t2
    
  7. ==============================

    7.

    SELECT name, phone_number FROM Call a
    WHERE a.phone_number NOT IN (SELECT b.phone_number FROM Phone_book b)
    
  8. ==============================

    8.또한,

    또한,

    select id from call
    minus
    select id from phone_number
    
  9. from https://stackoverflow.com/questions/367863/sql-find-records-from-one-table-which-dont-exist-in-another by cc-by-sa and MIT license