Nice programing

다른 테이블이 아닌 한 테이블에서 선택

nicepro 2020. 12. 26. 16:36
반응형

다른 테이블이 아닌 한 테이블에서 선택


한 테이블에는 있지만 다른 테이블에는없는 행을 찾으려고합니다. 두 테이블은 서로 다른 데이터베이스에 있고 일치하는 데 사용하는 열에 다른 열 이름이 있습니다.

아래에 쿼리, 코드가 있으며 아마도 작동한다고 생각하지만 너무 느립니다.

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입니다.


Sjoerd의 anti-join을 확장하면 이해하기 쉬운 SELECT WHERE 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.


두 테이블을 LEFT JOIN 할 수 있습니다. 두 번째 테이블에 해당 행이 없으면 값은 NULL입니다.

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

그래서 이것을하는 방법을 보여주는 많은 포스트가 웹에 있습니다. 저는 Johan & Sjoerd가 지적한 것과 같은 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`
)

Johan의 대답을 확장하기 위해 sub-select의 part_num 열에 null 값이 포함될 수 있으면 쿼리가 중단됩니다.

이를 수정하려면 null 검사를 추가하십시오.

SELECT pm.id FROM r2r.partmaster pm
WHERE pm.id NOT IN 
      (SELECT pd.part_num FROM wpsapi4.product_details pd 
                  and pd.part_num is not null)
  • 죄송하지만 담당자가 없어 댓글을 달 수 없습니다!

참조 URL : https://stackoverflow.com/questions/7596073/select-from-one-table-where-not-in-another

반응형