[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.에 확장 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.당신은 왼쪽 두 테이블을 조인 할 수 있습니다. 두 번째 테이블에 대응하는 행이없는 경우, NULL 값이 될 것이다.
당신은 왼쪽 두 테이블을 조인 할 수 있습니다. 두 번째 테이블에 대응하는 행이없는 경우, NULL 값이 될 것이다.
SELECT id FROM partmaster LEFT JOIN product_details ON (...) WHERE product_details.part_num IS NULL
-
==============================
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.그래서이 작업을 수행하는 방법을 보여 웹 게시물의 부하를 거기에, 나는 요한 & 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` )
from https://stackoverflow.com/questions/7596073/select-from-one-table-where-not-in-another by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 교리와 원시 SQL을 사용하여 (0) | 2020.06.02 |
---|---|
[SQL] 어떻게 엑셀 2005 개 데이터를 전송하거나 수출 SQL 서버 않습니다 (0) | 2020.06.02 |
[SQL] XML의 PATH ( ''), 1,1)에 대한 SELECT의 의미는 ... 무엇입니까? (0) | 2020.06.02 |
[SQL] 어떻게 SQL Server 인스턴스에 대한 데이터 디렉터리를 찾을 수 있습니까? (0) | 2020.06.02 |
[SQL] SQL 쿼리하지 다른 테이블에 ID와 기록을 찾을 수 (0) | 2020.06.02 |