MySQL : 다른 테이블에없는 행 선택


118

다른 테이블에 나타나지 않는 한 테이블의 모든 행을 선택하는 방법은 무엇입니까?

1 번 테이블:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+

표 2 :

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
+-----------+----------+------------+

Table2에없는 Table1의 행에 대한 출력 예 :

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+

아마도 다음과 같이 작동 할 것입니다.

SELECT * FROM Table1 WHERE * NOT IN (SELECT * FROM Table2)

답변:


96

다른 주석에서 언급 한대로 300 개의 열이 있고 모든 열을 비교하려는 경우 (열이 모두 동일한 이름이라고 가정) a NATURAL LEFT JOIN를 사용 하여 두 테이블 사이에서 일치하는 모든 열 이름을 암시 적으로 조인 할 수 있습니다. 모든 조인 조건을 수동으로 지루하게 입력 할 필요가 없습니다.

SELECT            a.*
FROM              tbl_1 a
NATURAL LEFT JOIN tbl_2 b
WHERE             b.FirstName IS NULL

이는 열에 NULL 값이없는 경우에만 예상대로 작동합니다. MySQL에서는 NULL! = NULL이므로 두 번째 테이블에 중복 행이 있더라도 NULL 값을 가진 모든 행이 반환됩니다.
Kyle Kochis 2015-04-07

84
300 개의 열이있는 경우 데이터베이스를 다시 디자인해야합니다.
Iharob Al Asimi

저에게도 효과가 있습니다. 감사합니다! 하지만 위에서 언급 한 것처럼 행이> 300이면 문제가 될까요?
thekucays jul.

예를 들어 "where b.FirstName is null"을 "where b.LastName is null"로 변경하면 어떻게 되나요? 차이점이 뭐야? 난, 난 여전히 SQL 새로운이 요청에 대한 미안 해요 : D
thekucays

184

이 아니라 열 이름을 기반으로 하위 선택을 수행해야합니다 *.

예를 들어 id두 테이블에 공통된 필드 가있는 경우 다음을 수행 할 수 있습니다.

SELECT * FROM Table1 WHERE id NOT IN (SELECT id FROM Table2)

더 많은 예제 는 MySQL 하위 쿼리 구문 을 참조하십시오 .


1
설명 주셔서 감사합니다! 내가 행의 모든 필드의 변화에 관심이 있기 때문에 난 정말 ..., 어떤 분야에 행의 선택을 기반으로 할 필요가 없습니다

비교할 열이 몇 개만있는 경우 @Steve의 예에 따라 조인을 수행 할 수 있습니다. 실제로 열이 많은 두 테이블의 데이터에 대한 일반적인 비교를 요청하는 경우 MySQL diff 도구 를 찾고 싶을 것입니다 .
Stennie

2
Table2에서보고있는 열에 null이 포함 된 경우 항상 빈 집합을 반환합니다. 기본 키를 기반으로하는 경우 문제가되지 않지만 다른 컨텍스트에서이 쿼리를 사용하려는 사람들과 관련이 있습니다.
Mark Amery 2014

4
하지만 빅 데이터에 대해 이야기하고 있다면 어떨까요? 예를 들어 Table2에는 1 억 개의 행이 포함되어 있습니까?
frops

똑똑하고 영리한 대답. 고마워 친구
Anjana Silva

44
SELECT *
FROM Table1 AS a
WHERE NOT EXISTS (
  SELECT *
  FROM Table2 AS b 
  WHERE a.FirstName=b.FirstName AND a.LastName=b.Last_Name
)

EXISTS 너를 도울 것이다...


2
좋은 대답, 대용량 데이터 세트에 경제적입니다. 감사합니다.
ekerner 2014 년

강한. 대규모 데이터 세트에 대한 베스트 답변
Ian Chadwick

35

표준 LEFT JOIN은 문제를 해결할 수 있으며, 조인의 필드가 인덱싱 된
경우 더 빠릅니다.

SELECT *
FROM Table1 as t1 LEFT JOIN Table2 as t2 
ON t1.FirstName = t2.FirstName AND t1.LastName=t2.LastName
WHERE t2.BirthDate Is Null

좋아, 그게 틀림 없어, btw 왜 WHERE t2.Birthdate Is Null대신 AND t1.Birthdate = t2.Birthdate?

당신이를 추가하는 경우, 다음 모든 행이 반환됩니다 때문에 출력에 두 번째 테이블에서만 행을하지 나타납니다 말
스티브

1
모든 행을 반환 할 필요가 없기 때문에 이것은 훌륭한 대답입니다 Table2!
dotancohen

동의합니다. 훌륭한 답변입니다. 4 개의 테이블 사이에 man-many 테이블이 있는데 AND를 내부 조인에 넣는 것이 가장 경제적 일 것입니다.
DR.

6

시험:

SELECT * FROM table1
    LEFT OUTER JOIN table2
    ON table1.FirstName = table2.FirstName and table1.LastName=table2.LastName
    WHERE table2.BirthDate IS NULL

4

이 간단한 쿼리를 시도하십시오. 완벽하게 작동합니다.

select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2);

-3

이것은 Oracle에서 나를 위해 일했습니다.

SELECT a.* 
    FROM tbl1 a 
MINUS 
SELECT b.* 
    FROM tbl2 b;

질문은 MySQL에 관한 것이 었습니다.
jelder

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