복붙노트

[SQL] 하나 개의 테이블에서 어디하지 다른의 선택

SQL

하나 개의 테이블에서 어디하지 다른의 선택

나는 하나 개의 테이블에 있지만 다른 두 테이블이 다른 데이터베이스에있는 행을 찾아도 내가 맞게 사용하고있는 열을 다른 열 이름을 가지고 노력하고있어.

나는 쿼리, 코드 아래에있어, 나는 그것이 아마 작동 생각하지만 그것의 방법은 너무 느린 :

SELECT `pm`.`id`
FROM `R2R`.`partmaster` `pm`
WHERE NOT EXISTS (
    SELECT * 
    FROM `wpsapi4`.`product_details` `pd`
    WHERE `pm`.`id` = `pd`.`part_num`
)

다음과 같이하려고하는 쿼리는 그래서 :

wpsapi4.product_details 데이터베이스에없는 R2R.partmaster 데이터베이스에서 모든 ID를 선택합니다. 내가 일치 해요 열은 partmaster.id & product_details.part_num 있습니다

해결법

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

    1.에 확장 Sjoerd의 방지에 가입, 당신은 또한 쉽게 SELECT X NOT IN (SELECT) 패턴을 이해하는 데 사용할 수 있습니다.

    에 확장 Sjoerd의 방지에 가입, 당신은 또한 쉽게 SELECT X NOT IN (SELECT) 패턴을 이해하는 데 사용할 수 있습니다.

    SELECT pm.id FROM r2r.partmaster pm
    WHERE pm.id NOT IN (SELECT pd.part_num FROM wpsapi4.product_details pd)
    

    당신은 단지 공간과하지와 같은 일반 열 이름에`예약어에 역 따옴표, 이름을 사용해야합니다.

    MySQL을 5+ 쿼리의이 종류는 꽤 빨리 실행됩니다. MySQL의 3/4에 그것은 느린.

    있는지 확인은 해당 필드에 대한 인덱스가 당신은 pm.id에 인덱스, pd.part_num이 필요합니다.

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

    2.당신은 왼쪽 두 테이블을 조인 할 수 있습니다. 두 번째 테이블에 대응하는 행이없는 경우, NULL 값이 될 것이다.

    당신은 왼쪽 두 테이블을 조인 할 수 있습니다. 두 번째 테이블에 대응하는 행이없는 경우, NULL 값이 될 것이다.

    SELECT id FROM partmaster LEFT JOIN product_details ON (...) WHERE product_details.part_num IS NULL
    
  3. ==============================

    3.에서 PART_NUM 열 널 (null) 값은 다음 쿼리가 중단됩니다 포함 할 수있는 서브 - 선택하면, 요한의 대답에 확장합니다.

    에서 PART_NUM 열 널 (null) 값은 다음 쿼리가 중단됩니다 포함 할 수있는 서브 - 선택하면, 요한의 대답에 확장합니다.

    이 문제를 해결하려면, 널 체크를 추가 ...

    SELECT pm.id FROM r2r.partmaster pm
    WHERE pm.id NOT IN 
          (SELECT pd.part_num FROM wpsapi4.product_details pd 
                      where pd.part_num is not null)
    
  4. ==============================

    4.그래서이 작업을 수행하는 방법을 보여 웹 게시물의 부하를 거기에, 나는 요한 & Sjoerd에 의해 지적 밖으로 같은 3 가지 방법을 발견했습니다. 나는 잘 분명히 그들이 잘 작동, 작업에 이러한 쿼리 중 하나를 가져올 수 없습니다 제대로 작동하지 않는 내 데이터베이스의 그 느린 모든 실행 된 쿼리합니다.

    그래서이 작업을 수행하는 방법을 보여 웹 게시물의 부하를 거기에, 나는 요한 & Sjoerd에 의해 지적 밖으로 같은 3 가지 방법을 발견했습니다. 나는 잘 분명히 그들이 잘 작동, 작업에 이러한 쿼리 중 하나를 가져올 수 없습니다 제대로 작동하지 않는 내 데이터베이스의 그 느린 모든 실행 된 쿼리합니다.

    그래서 다른 사람이 유용하게 사용할 수있는 또 다른 방법을했다 :

    그것의 기본적인 요점은 임시 테이블을 생성하고 모두와 함께 그것을 채울 정보를 다음 다른 테이블에있는 모든 행을 제거하는 것입니다.

    그래서이 3 개 질의를했고, 그것은 (몇 순간에) 빨리 달렸다.

    CREATE TEMPORARY TABLE
    
    `database1`.`newRows`
    
    SELECT
    
    `t1`.`id` AS `columnID`
    
    FROM
    
    `database2`.`table` AS `t1`
    

    .

    CREATE INDEX `columnID` ON `database1`.`newRows`(`columnID`)
    

    .

    DELETE FROM `database1`.`newRows`
    
    WHERE
    
    EXISTS(
        SELECT `columnID` FROM `database1`.`product_details` WHERE `columnID`=`database1`.`newRows`.`columnID`
    )
    
  5. from https://stackoverflow.com/questions/7596073/select-from-one-table-where-not-in-another by cc-by-sa and MIT license