2009-05-01 3 views
1

여기 상황이 있습니다. 사람들의 정보가 들어있는 테이블이 있습니다. 일부는 다른 시스템에서 가져오고 일부는 수동으로 가져옵니다. 내가하고 싶은 것은 모두를 끌어들이는 것이지만 수동으로 입력 한 레코드와 가져온 레코드가있는 경우 가져온 레코드 만 선택하려고합니다 (최신 상태 일 가능성이 높기 때문에). 여기 SQL Server 제외

는 내가 지금까지 무엇을 가지고 있지만, (그것은 단지 수동으로 입력 레코드를 반환) 작동하지 않습니다

SELECT --fields go here 
FROM 
     (
       SELECT PERSON_UID, instype 
       FROM AdmitsInterfaceTable 
       WHERE instype='M' --Manually entered people 
      EXCEPT 
       SELECT PERSON_UID, instype 
       FROM AdmitsInterfaceTable 
       WHERE instype='I' --Imported people 
     ) P, 
     AdmitsInterfaceTable A 
    WHERE 
     P.PERSON_UID=A.PERSON_UID 
     AND P.instype=A.instype 

을 나는이 때문에 내부의 작동하지 않는 느낌이 또한 instype 열을 가져 오는 쿼리가 있지만이를 수행하는 더 나은 방법을 생각할 수 없습니다. 어떤 충고?

+0

레코드가 수동으로 첨가하고 하나가 가져 오기에서 추가 된 경우 첫째, 그들은 같은 person_uid있을 것입니다? 그렇다면 가져 오기에서 레코드를 추가하는 대신 왜 레코드를 업데이트하지 않는 것입니까? 왜 의도적으로 복제물을 만드는거야? 또한 ANSI 표준 조인을 사용하십시오. 조인 구문의 유효 기간은 17 년입니다. – HLGEM

+0

데이터는 실제로 다른 곳에서 지속적으로 보관됩니다. 벤더 시스템이 액세스 할 수있는 임시 스테이징 포인트로 테이블을 가져 와서 어떤 레코드를 업데이트 및/또는 삽입해야하는지 결정합니다. 예, 준비 영역의 레코드를 업데이트 할 수 있지만 가져온 레코드를 매일 제거한 다음 다시 가져 오는 것이 더 쉽습니다. 수동으로 입력하는 경우는 거의 없지만 신중하게 처리하지 않으면 문제가 발생할 수 있습니다. –

+0

제안 된 솔루션 중 어떤 것이 도움이됩니까? –

답변

1
SELECT PERSON_UID, instype 
    FROM AdmitsInterfaceTable a 
    WHERE instype='I' --get all imported people    
union -- plus all manuals who are not also imported 
SELECT PERSON_UID, instype 
    FROM AdmitsInterfaceTable a 
    WHERE instype='M' --Imported people 
    and not exists ( -- without imported matches 
    select * from FROM AdmitsInterfaceTable b 
    WHERE instype='I' and b.person_uid = a.person_uid); 
0

당신은 시도 할 수 :

SELECT CASE WHEN b.person_UID is null THEN a.person_UID ELSE person_UID END, 
CASE WHEN b.person_UID is null THEN a.instype ELSE instype END 
--and so forth through all the columns you want 
FROM 
(SELECT PERSON_UID, instype -- add list of additional fields you need here 
from AdmitsInterfaceTable WHERE instype='M') A 
LEFT JOIN 
(SELECT PERSON_UID, instype -- add list of additional fields you need here 
from AdmitsInterfaceTable WHERE instype='I') B on A.PERSON_UID = B.PERSON_UID 
0
SELECT --fields go here 
FROM AdmitsInterfaceTable A 
WHERE 
    P.PERSON_UID=A.PERSON_UID 
    AND P.instype=A.instype 
AND instype='M' --Manually entered people 
AND person_uid not in (
SELECT PERSON_UID FROM AdmitsInterfaceTable 
WHERE instype='I' --Imported people 
) 
관련 문제