2013-05-30 3 views
2

저는 SQL을 처음 사용하기 때문에 아직이 SQL 쿼리를 가져올 수 없습니다. 현재 가지고있는 내역은 다음과 같습니다.표 A의 레코드를 가져 와서 표 B에 없음

SELECT * FROM tableA 
LEFT OUTER JOIN tableB 
ON tableA.`full_name` = tableB.`full_name` 
WHERE tableB.`id` IS NULL 

두 테이블 모두 이름과 주소가 모두 기록 된 레코드입니다. 나는 tableA에있는 사람들을 위해 모든 레코드를 얻을 필요가 있지만 tableB는 가지고 있지 않습니다. 아래의 그림은 내가 필요한 기본적으로 :

Ven Diagram

문제는 두 사람이 같은 이름,하지만 서로 다른 주소를 가질 수 있다는 것이다. 그래서 궁극적으로 나는 중복 된 이름과 주소를 가진 중복을 제외하고 tableA에있는 모든 사람들의 기록을 얻어야합니다.

SELECT tableA.id FROM tableA 
LEFT OUTER JOIN tableB 
-- people are the same if fullname and adress match 
ON tableA.`full_name` = tableB.`full_name` 
    AND tableA.adress = tableB.adress 
-- filter people that re in tableA only 
WHERE tableB.`id` IS NULL 
-- filter duplicates 
GROUP BY tableA.id 

:

id,full_name,first_name,last_name,title,phone,address,city,state,postal_code 
+0

당신이 그래서 우리는 이름을 추측하지 않아도 테이블의 테이블 구조를 보여줄 수 :

또한이 답변을 살펴 있나요? :) –

+0

권자, 예. 좋은 생각. :) 나는 그 질문을 편집 할 것이다. – mdance

+0

DISTINCT 이름과 주소 조합이 필요하다는 말입니까? 또는 주소가 여러 개인 사람들을 위해 하나의 주소를 선택해야합니까? –

답변

2

다음 쿼리는 전체 이름과 ADRESS에 따라 TableB의에없는 그 TABLEA 당신에게 사람들의 모든 ID를 줄 것이다 다음과 같이

각 테이블은 열이 이 selet을 쉽게 편집하여 tableA에서 필요한 정보를 포함 할 수 있습니다.

0

이 우수한 페이지를 확인하셨습니까? http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null 
+0

이것은 내가 처음에 가지고있는 것을 얻는 곳입니다. 그러나 같은 이름을 가진 사람들을 갖는 문제는 해결하지 않지만 주소는 다릅니다. – mdance

+0

어떻게 든이 이미지를 이미 보았습니다 ;-) – Kai

+0

lol yea. 그 이미지는 필자가 필요한 것을 다이어그램으로 만드는 데 도움이됩니다. – mdance

3

두 분야에 참여하고 있기 때문에 당신이있어 옵션 또한 not in 참조 (Christian Ammer's) 대답을 사용할 수 있습니다

SELECT DISTINCT tablea.* 
FROM tablea 
WHERE NOT EXISTS (SELECT * 
        FROM tableb 
        WHERE tablea.`full_name` = tableb.`full_name` 
          AND tableA.adress = tableB.adress) 

DEMO

, (Friederike S' answer)Not exists 안티 - 가입하다

다른 mor 어두운 솔루션은 ALL 키워드를 사용하는 것입니다. 그것은 당신이 절 존재하지 사용할 수 있습니다 NOT IN

SELECT DISTINCT tablea.* 
FROM tablea 
WHERE 

(tablea.`full_name` , tableA.address) 

    != ALL (SELECT tableb.`full_name`, tableB.address 
      FROM tableb) 

DEMO

+0

귀하의 답변도 잘 작동했지만 Friederike의 대답은 처음 이었기 때문에 선택했습니다. 감사합니다 – mdance

+1

@mdance 한 가지 추가 노트. 관련 컬럼의 공백성에 따라 두 성능 특성이 달라집니다. Quassnoi의 기사 [LEFT JOIN/IS NULL 대 NOT EXISTS : null 가능 컬럼] (http://planet.mysql.com/entry/?id=24888) –

+0

또 다른 옵션은 [내 대답 ] (http://stackoverflow.com/a/16846165/237483)) NOT EXISTS 옵션과 같은 상관 하위 쿼리가 필요하지 않습니다. –

0

매우 유사합니다. 이 조건은 지정된 full_name에 대해 tableB에 레코드가없는 모든 레코드를 tableA에서 리턴합니다. 제 생각에는

SELECT * FROM 
    tableA 
    WHERE 
    NOT EXISTS (select * from tableB Where tableA.full_name = tableB.full_name); 
3

가 대신 가입의 하위 쿼리와 같은 쿼리를 작성하는 논리이다. 또한 상관 관계가없는 하위 쿼리이므로 JOIN 버전과 성능 차이가 없어야합니다.

SELECT * 
FROM tableA 
WHERE (full_name, address) NOT IN 
(SELECT full_name, address FROM tableB); 

SQL Fiddle에서 결과를 볼 수 있습니다.

관련 문제