다른 테이블과 조인하지 않는 행을 제외하는 방법은 무엇입니까?


87

두 개의 테이블이 있는데 하나에는 기본 키가 있고 다른 하나는 외래 키로 있습니다.

보조 테이블에 키가 포함 된 항목 이없는 경우에만 기본 테이블에서 데이터를 가져오고 싶습니다 . 해당 키로 결합하는 행만 반환하는 단순한 내부 결합의 반대입니다.

답변:


274

대체 텍스트

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

조인의 전체 이미지 대체 텍스트

aticle에서 : http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx


9
드디어! 왜 그들은 교과서에 이것을 가지고 있지 않고, 왜 유니의 강사들은 이것을 가지고 있지 않습니까?! 그들은 세계에서 가능한 최악의 설명을 사용했습니다.
pythonian29033

5
이것은 금입니다. 내용이없고 칭찬 만하는 댓글은 싫지만 어서! 이것은 멋진 답변입니다. @Pranay Rana 감사합니다.
0xbe5077ed

1
저를 위해 설명해주십시오. B.Key IS NULL그러나 우리는 여전히 비교 가능 A.Key = B.Key합니까?
Do Nhu Vy

1
@DoNhuVy 간단합니다. 비교는 "ON"절에 있으며, 일치하는 행이 없으면 LEFT 또는 RIGHT 조인에서 모든 NULL이있는 행이 조인 된 후 일치하는 행이 없는지 확인하기 위해 IS NULL을 테스트합니다. . (이것은 단지 테스트중인 필드가 null가 아닌 경우, 즉 다른 이유로 NULL을 가질 수 없습니다, 그런데, 작동)
그레고리 마가 샥

아래 쿼리를 사용하고 있습니다. SELECT A. * FROM #PurgeFilesListNew A FULL OUTER JOIN #DoNotPurgeFilesListNew B ON A.JobFileId = B.JobFileId AND A.AccountID = B.AccountID WHERE A.JobFileId IS NULL OR B.JobFileId IS NULL AND A.AccountID가 NULL이거나 B.AccountID가 NULL입니다. 기본적으로 "ON"절에서 두 값을 비교하는 두 가지가 있습니다. 제대로 작동하지만 쿼리가 일치하지 않는 행에 대해 null 행을 반환합니다. 이것을 해결하는 방법? 도와주세요
HarshSharma

10
SELECT
   *
FROM
   primarytable P
WHERE
   NOT EXISTS (SELECT * FROM secondarytable S
     WHERE
         P.PKCol = S.FKCol)

일반적으로 , (NOT) EXISTS있는 더 나은 선택 후 (NOT) IN또는(LEFT) JOIN


잘 그는 DBRMS가 사용되는 것을 게시하지 않았지만 MySql에서 LEFT JOIN성능을 능가합니다NOT EXIST
The Scrum Meister

@ The Scrum Meister : 내가 더 빨리 말했습니까? 의미와 논리적 차이를 발견하기 위해 가입 대 EXISTS 대 ...에서 검색
GBN

@gbn 죄송합니다. "더 나은 선택"이 더 빠른 것을 의미한다고 생각했습니다. 그렇다면 어떤 방식으로 더 나은 선택인지 설명해 주시겠습니까? explainextended.com/2009/09/18/…
The Scrum Meister

1
@The Scrum Meister : 일반적으로 모든 종류의 JOIN에는 DISTINCT가 필요할 수 있습니다. 목록에 널이있는 NOT IN은 거짓을 제공합니다. IN / EXISTS는 동일하게 작동합니다. 그러나 유일한 "안전한"구조는 불일치를
원하지


4

"존재하지 않음"왼쪽 조인 사용 :

SELECT p.*
FROM primary_table p LEFT JOIN second s ON p.ID = s.ID
WHERE s.ID IS NULL

4

또 다른 해결책은 다음과 같습니다.

SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)

3
SELECT P.*
FROM primary_table P
LEFT JOIN secondary_table S on P.id = S.p_id
WHERE S.p_id IS NULL

2
질문이 있습니다. 조건을 사용하고 P.key = S.key라고 말하면 where S.key IS NULLP.key도 null이되지 않습니까?
소미

2

두 번째 테이블에도있는 첫 번째 테이블에서 열을 선택하려면이 경우에도 사용할 수 있습니다 EXCEPT.이 경우 열 이름도 다를 수 있지만 데이터 유형은 동일해야합니다.

예:

select ID, FName
from FirstTable
EXCEPT
select ID, SName
from SecondTable

0

이는 Cognos에서 SQL "Not in"문을 만들 수 있었지만 실행하는 데 너무 오래 걸렸기 때문에 COGNOS에서 사용하는 데 유용했습니다. Cognos의 테이블 B에 조인하기 위해 테이블 ​​A를 A.key "not in"B.key로 수동으로 코딩했지만 쿼리가 너무 오래 걸리거나 5 분 후에 결과를 반환하지 않았습니다.

Cognos에서 "NOT IN"솔루션을 찾고있는 다른 사람을 위해 제가 한 일은 다음과 같습니다. 연결 유형을 선택하여 Cognos에서 LEFT JOIN을 사용하여 테이블 A와 B를 조인하는 쿼리를 만듭니다. 테이블 A.Key에는 테이블 B에 "0에서 N"값이 있습니다. 그런 다음 테이블 B에 대한 필터 (Where 절에 해당)를 추가합니다. .Key가 NULL입니다.

빠르게 달렸고 매력처럼.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.