2011-09-29 5 views
2

보기에서 테이블에 고유 한 값을 삽입하려고합니다. 나는 아래와 같은 테이블이 있습니다 은 "fromView을" 고유 값 삽입 SQL Server

id | passport | name | surname | address 
1  44543  John Smith  xxxxx 
2  10001  Mike Thomps avasfa 
3  10001  Mike Thomps avasfa 
4  10001  Mike Thomps avasfa 
5  14221  Robert Martinez lkjij3 

내 "toTable"동일한 데이터 구조를 가지고 있지만, 여권 열의 고유 제한 조건 여권

에는 고유 제한 조건이 없습니다.

INSERT into toTable (id, passport, name, surname, address) 
SELECT (id, passport, name, surname, address) 
FROM fromView a 
WHERE passport IS NOT NULL AND NOT EXISTS (SELECT * 
              FROM toTable b 
              WHERE b.passport = a.passport) 

그러나 이것은 나에게 아래의 오류 제공 :

내 삽입 쿼리는 이것이다

객체 고유 인덱스 'toTable_Passport_Unique'와 'toTable'에 중복 키 행을 삽입 할 수 있습니다.

그래서, 테이블에 고유 한 값을 삽입하는 방법을 모르겠습니다. 미리 감사

+1

어떤 DBMS를 사용하고 있습니까? –

답변

4

에서이 쿼리를 실행하여 여러 항목 모든 여권의 목록을 얻을 수 있습니다

Select Passport, Count (*) NumEntries 
From fromTable 
Group by Passport 
Having Count (*) > 1 

는 그런 다음이 중복 행 수행 할 작업을 결정해야합니다. 이러한 중복의 전체 행을 보려면 다음 쿼리를 실행

Select * 
From fromTable 
Where Passport In 
(
    Select Passport, Count (*) NumEntries 
    From fromTable 
    Group by Passport 
    Having Count (*) > 1 
) 
Order by Passport 

하는의 당신이 (가장 높은 것 이드의 의미)이 쿼리는 당신에게 각 여권 삽입 된 새로운 행으로 이동하기로 결정 말을하자 필요한 데이터.

Select T1.* 
From fromTable T1 
Where Id In 
(
    Select Max (Id) Id 
    From fromTable 
    Group by Passport 
) 

우리가 같은 passport을 위해, 우리는 같은 name, surnameaddress있을 것이라는 점을 가정 할 수 있다면 당신은

INSERT into toTable (id, passport, name, surname, address) 
Select T1.* 
From fromTable T1 
Where Id In 
(
    Select Max (Id) Id 
    From fromTable 
    Group by Passport 
) 
+0

이것도 작동하고 더 간단한 문장 감사합니다! – grteibo

0

를 사용하여 삽입 할 수 있습니다, 우리는 원하는 가장 최근 (최고) id는 시도

INSERT INTO toTable (id, passport, name, surname, address) 
SELECT max(id), passport, name, surname, address 
FROM fromTable 
--optional WHERE clause in case there's already data in toTable: 
WHERE passport NOT IN (SELECT to.passport from toTable [to]) 
GROUP BY passport, name, surname, address 
+0

@Widow - 그건 나쁜 가정이다. –

+0

나는 나쁜 말을하지 않을 것이다. 결국 우리는 여권을 다루고 있으며, 예제 테이블은 같은 가정을 포함하고있다. – Widor

+0

사람들은 항상 주소를 변경하고 때로는 이름을 변경합니다. 나는 그 가정을하고 싶지 않을 것입니다. –

2
insert into toTable (id, passport, name, surname, address) 
select id, passport, name, surname, address 
from (
     select *, 
      row_number() over(partition by passport order by id) as rn 
     from fromTable 
    ) as T 
where rn = 1 
+0

나는 정말로 row_numer()와 파티션에 대해 안다. 그러나 이것은 고맙다. – grteibo

+0

@grteibo - 자세한 내용은 여기를 참조하십시오. http://msdn.microsoft.com/en-us/library/ms186734.aspx –

0
insert into toTable (id, name, surname, addr, passport) 
    select 
    testA1.id, testA1.name, testA1.surname, testA1.addr, testA1.passport 
    from 
    fromTable as testA1 right join (select min(id) AS distinctID, passport from fromTable group by passport) as testA2 on 
    testA2.distinctID = testA1.id