2012-04-03 4 views
3

중복을 제거하고 양쪽에는 다음과 같은 필드가 있습니다 이들이 채워지고 다른 하나에는 idnumber 또는 중간 이름이 채워지지 않습니다., 나는 SQLite는 DB에 두 개의 테이블이

내가 좋아하는 뭔가를 할 수 있도록하고 싶습니다 :

select idnumber, firstname, middlename, lastname, email, login 
from users1,users2 group by login; 

그러나 나는 "모호한"오류가 발생합니다. 다음과 같이하면 :

select idnumber, firstname, middlename, lastname, email, login from users1 
union 
select idnumber, firstname, middlename, lastname, email, login from users2; 

LOOKS처럼 작동하지만 중복 된 것을 볼 수 있습니다. 내 이해는 노동 조합이 중복을 허용해서는 안되지만 두 번째 사용자 테이블에 채워진 모든 필드 (예 : "20, bob, alan, smith, [email protected], bob. "는"NULL, bob, NULL, smith, [email protected], bob "과 동일하지 않습니다.

아이디어가 있으십니까? 내가 뭘 놓치고 있니? 내가하고 싶은 것은 "로그인"에 따라 중복 제거하는 것입니다.

감사합니다.

답변

2

union은 중복 된 레코드를 제거합니다 (union all은 그렇지 않음을 유의하십시오!). 두 개의 레코드는 모든 컬럼 값이 일치 할 때 중복으로 간주됩니다. 위의 예에서 질문에서 고려한 것은 NULL20 또는 'alan'이 아니므로 해당 레코드가 중복으로 간주되지 않습니다.

편집 :

[...] 내가 생각할 수있는 유일한 방법은 새로운 테이블을 생성 할 것이다 [...]

필요가 없습니다

. 당신은 middlenameidnumber에 다른 값을 가지고 있는지 확인하는 경우 그러나

select login, max(idnumber), max(firstname), max(middlename), max(lastname), 
    max(email) from (
    select idnumber, firstname, middlename, lastname, email, login from users1 
    union 
    select idnumber, firstname, middlename, lastname, email, login from users2 
) final 
group by login 

을 할 수 있습니다 모든 나머지에 의해 최대 만 필드와 그룹 : 난 당신이 다음을 수행 할 수 있다고 생각합니다.

+0

죄송합니다. 중복되는지 확인하기 위해 "로그인"이 핵심이라고 생각합니다. 따라서 "20, bob, alan, smith, [email protected]bob.com, bob"은 "NULL, bob, NULL, smith, [email protected], bob"과 일치해야합니다. "밥". 이 작업이 가능합니까? 내 말은, 내가 생각할 수있는 유일한 방법은 새로운 테이블을 만들고 모든 정보를 복사 한 다음 "로그인으로 그룹화"하는 것입니다. 이렇게하는 것이 더 좋은 방법이 있습니까? – staze

+1

완벽! 완벽하게 작동합니다! 감사! – staze

0

로그인을 통해 불완전한 테이블을 완성 된 테이블에 남겨 둘 수 있습니다. 그런 다음 결과 집합을 프로그래밍 방식으로 조작합니다.

관련 문제