SQL 스 크 립 트 를 이용 하여 서로 다른 데이터베이스 에 데 이 터 를 가 져 와 중복 을 피 하 는 세 가지 방법

머리말
어떤 언어 든 코드 에 중복 되 는 코드 를 보면 패키지 로 재 활용 하고 싶 습 니 다.SQL 에서 도 마찬가지 입 니 다.만약 에 우리 가 인터페이스 가 없 으 면 자주 해 야 하 는 조작 이 필요 합 니 다.우 리 는 스 크 립 트 를 써 서 다음 에 다시 쓰 지 않도록 하 겠 습 니 다.그러나 그 중에서 문제 가 발생 했 습 니 다.이 문 제 는 저도 별로 신경 쓰 지 않 았 습 니 다.어느 순간 에 첫째 는 제 가 쓴 스 크 립 트 를 보고 웃 으 며 한 마디 물 었 습 니 다.당신 의 스 크 립 트 가 반복 되 는 지 물 었 습 니 다.저 는 어 리 석 었 습 니 다.이런 상황 을 피 할 수 없 었 습 니 다.예 를 들 어 삽입 작업 을 하면 다음 에 다른 동료 가 스 크 립 트 를 수행 할 때 중복 데 이 터 를 삽입 할 수 있 습 니 다.온라인 이 라면 어 리 석 었 습 니 다.그래서 첫째 는 저 에 게 수업 을 해 주 었 습 니 다.그 후에 스 크 립 트 를 쓸 때마다 논리 적 판단 을 가 했 습 니 다.예,중복 실행 이 가능 합 니 다.
다음은 최근 프로젝트 에서 만난 장면 을 이야기 하 겠 습 니 다.
화제 도입
국민 성인의 체질 테스트 에서 성년 의 나 이 를 계산 해 야 하고 체 측 연령 은 20-59 세이 다.만약 에 현재 날짜 가 성인의 생년월일 을 초과 하지 않 으 면 나 이 는 1 로 줄어든다.그렇지 않 으 면 줄 지 않 는 다.예 를 들 어 성인의 생년월일 은 1991-11-01 이다.이때 성인의 체 측 연령 은 25 세이 고 1991-10-01 이면 체 측 연령 은 26 세이 다.이것 이 첫걸음 이다.두 번 째 단 계 는 그룹 을 나 누 는 것 이다.각 연령 대의 사람들 이 테스트 하 는 항목 이 다르다.즉,연령 에 따라 그룹 을 나 누 어야 한다.체 측 문서 에서 3 조로 나 뉘 는데 한 조 는 남성 20-39 세,한 조 는 여성 20-39,마지막 조 는 남녀 40-59 로 나 누 지 않 는 다.마지막 으로 우리 가 해 야 할 일 은 서로 다른 연령 대 와 성별 에 따라 조 를 나 누 는 것 이다.
우 리 는 아래 표를 작성 한다.


20~39 세의 남성 도 있 고 20~39 세의 여성 도 있 음 을 알 수 있다.40~59 세 남성 등 도 있 는데,문 제 는 SQL 을 어떻게 활용 해 국민 성인 체질 테스트 문서 에 따라 이 같은 성인의 실제 나 이 를 계산 하 느 냐 하 는 것 이다.

SELECT Id ,
  DATEDIFF(YEAR, Birthday, GETDATE()) AS age ,
  Name
FROM dbo.t1

상기 조회 가 현저히 정확 하지 않 은 것 을 보 았 습 니 다.생년월일 이 되 지 않 은 사람의 나 이 는 1 을 빼 지 않 았 습 니 다.이때 우 리 는 DATEPART 함 수 를 이용 하여 첫 번 째 매개 변 수 를 dayofyear 로 지정 할 수 있 습 니 다.이 매개 변 수 는 지정 날짜 가 이 해 의 일수 임 을 나타 냅 니 다.예 를 들 어 우리 가 현재 며칠 이 지 났 는 지 알 수 있 습 니 다.

SELECT DATEPART(dayofyear, GETDATE())

SELECT DATEPART(dayofyear, '2017-12-31')

우 리 는 생년월일 의 일수 와 현재 날짜 의 일 수 를 통 해 현재 날짜 일수 보다 크 면 생일 이 아직 도착 하지 않 았 음 을 설명 하고 그렇지 않 으 면 1 을 뺀 다.

SELECT Id ,
  DATEDIFF(YEAR, Birthday, GETDATE())
  - CASE WHEN DATEPART(DAYOFYEAR, Birthday) > DATEPART(DAYOFYEAR,
                GETDATE()) THEN 1
    ELSE 0
   END Age ,
  Name
FROM dbo.t1

이때 우 리 는 연령 대의 구분 을 완 성 했 고,다음은 다른 데이터베이스 테스트 2 에 삽입 합 니 다.여기 서 내 가 생각 할 수 있 는 것 은 두 가지 방식 이다.만약 다른 환영 보충 이 있다 면.
LEFT JOIN ....IS NULL
우 리 는 왼쪽 연결 을 이용 하여 삽입 을 하고 중복 되면 삽입 해 야 할 표 의 메 인 키 는 반드시 NULL 이 아니 므 로 NULL 판단 을 추가 하면 중복 삽입 문 제 를 제거 할 수 있 습 니 다.

INSERT INTO test2.dbo.t2
  ( UserId ,
   Birthday ,
   Gender ,
   Name
  )
  SELECT t1.Id ,
    t1.Birthday ,
    t1.Gender ,
    t1.Name
  FROM dbo.t1 AS t1
    LEFT JOIN test2.dbo.t2 AS t2 ON t1.Id = t2.UserId
  WHERE t2.Id IS NULL

다시 실행 할 때 영향 을 받 은 줄 수 를 0 으로 되 돌려 줍 니 다.

NOT EXISTS/NOT IN

INSERT INTO test2.dbo.t2
  ( UserId ,
   Birthday ,
   Gender ,
   Name
  )
  SELECT t1.Id ,
    t1.Birthday ,
    t1.Gender ,
    t1.Name
  FROM dbo.t1 AS t1 
  WHERE NOT EXISTS(SELECT t2.UserId
     FROM test2.dbo.t2 t2
     WHERE t2.UserId = t1.Id)
총결산
이 절 에 서 는 SQL 스 크 립 트 를 사용 하여 중복 삽입 문 제 를 피 하 는 동시에 생년월일 에 따라 실제 나 이 를 조회 하 는 방법 을 설명 합 니 다.
자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기