2010-07-12 3 views
1

테이블을 조인하고 다른 테이블과 상호 참조하는 효율적인 방법을 알아 내려고하고 있습니다. 조인에있는 각 레코드에 필드는 다른 테이블에 있습니다.두 개의 db 테이블을 조인하고 다른 레코드를 참조하는 방법

이것은 내가 지금까지 가지고있는 것입니다 - 나는 어떻게 든 각 레코드의 reg_no가 구매자 테이블에 존재하지 않도록 (기본적으로 자동화 된 이메일을 보내기 전에) 확인할 수 있어야합니다. 모든 포인터에 감사 드리며 각 레코드를 반복하고 개별 조회를 수행하지 않아도됩니다.

SELECT * FROM (`owners`, `buyers`) 
JOIN `records` ON (`records`.`pa_no` = `owners`.`contact_no`) 
WHERE email <> "" AND `buyers`.reg_no <> `records`.reg_no 
+0

은 제외하려고.. 쿼리에서 중복 된 reg_nos를 사용하여 레코드를 작성하거나 중복을 식별하여 제거 할 수 있습니까? –

+0

전자 - 전 구매자 테이블에 아직 reg_no가없는 사람들에게 이메일을 보내고 싶습니다. – kenny99

+0

나는 이것이 잘못된 방향으로 가고 있다고 생각합니다. 'records.reg_no'는'buyers.reg_no'의 외래 키처럼 냄새가납니다. 그렇다면 해당 구매자를 보유하지 않고도 레코드를 만들 수 있도록 허용하는 것이 나쁜 디자인처럼 보입니다. –

답변

0

시도 :

select * from `owners` 
join `records` ON (`records`.`pa_no` = `owners`.`contact_no`) 
WHERE email <> "" 
and not exists (select reg_no from `buyers` 
       where `buyers`.reg_no = `records`.reg_no) 
+0

그게 완벽 해! 많은 감사 – kenny99

0

당신이 LEFT JOIN에게 같은 의미합니까?

SELECT r.reg_no 
    FROM records as r LEFT JOIN buyers as b ON (r.reg_no = b.reg_no) 
    WHERE b.reg_no IS NULL 

좌측은 B의 연관된 행 것이다 발견되지 않은 행을 정상으로 A. 모든 행하기위한 적어도 하나의 행으로하면 테이블을 제공 가입 할 테이블 A와 B 사이의 조인 생략 된; LEFT JOIN의 경우이 행은 포함되지만 B의 모든 열은 단순히 NULL 값을 갖습니다. 따라서 NULL이 될 수없는 필드를 테스트 할 수 있습니다 (기본 키 또는 외래 키처럼). NULL이면 A의 해당 행에 B에 연관된 행이 없음을 확신합니다.

그리고 귀하의 질문을 올바르게 이해합니다. 이것은 buyer 정보가없는 records의 모든 행 (owner 정보와 함께)의 표입니다.

위의 내용을 하위 쿼리 또는 뷰로 사용하고 정상적으로 owner을 사용하여 조인하거나, 모두 하나로 할 수 있습니다 (MySQL이이를 최적화 할만큼 충분히 지능적이어야한다고 생각합니다). 상응) : 나는 그것이 작동하지 않을 수 있습니다 생각하는

SELECT * -- though probably you want to specify what columns you want 
    FROM (owners o JOIN records r ON (o.contact_no=r.pa_no)) 
    LEFT JOIN buyers b ON (r.reg_no=b.reg_no) 
    WHERE email<>'' AND b.reg_no IS NULL 

(난 그냥이 테스트를하지 않은, 그것의 타이핑 내가 틀렸다면 제발 올바른)

+0

'ON' 절은'b.reg_no'가 NULL인지 여부에 대해서는별로 의미가 없습니다. –

+0

완벽 함. LEFT JOIN이기 때문에 b.reg_no가 NULL이 될 유일한 방법은 NOT NULL 열이라고 가정 할 때 조인이 일치하는 것을 찾지 못하는 것입니다. 이는 행이 존재하지 않는 것을 찾는 대체 방법입니다. –

+0

설명 해 주셔서 감사합니다. - 이제이 작업을 수행하는 여러 가지 방법이 있습니다. 매우 유용합니다. – kenny99

관련 문제