문제

테이블이 있는데 다른 테이블에 레코드를 삽입하고 있습니다. 삽입 된 레코드를 표시하는 가장 좋은 방법은 무엇입니까? 따라서 다시 삽입하려고 시도하지 않습니까?

도움이 되었습니까?

해결책

다음과 같은 두 테이블의 차이점을 볼 수 있습니다.

Tablefoo에서 *를 선택하십시오
Tablefoo.commoncolumn = tablebar.commoncolumn에서 테이블 바에 왼쪽 가입
여기서 tablebar.commoncolumn은 null입니다

아이디어는 두 테이블 모두 일치하는 열이 있고 열이 NULL 일 때 결합 된 레코드는 테이블 바에만 존재하는 레코드입니다.

이것이 작동하는 이유는 왼쪽 결합이 테이블 중 하나에 널 값이 있더라도 레코드를 반환하기 때문입니다. 내부 조인과 달리 반대입니다.

해당 레코드를 받으면 반환 된 ID를 기준으로 삽입 할 수 있습니다.

다른 팁

다른 테이블에없는 레코드 만 삽입하여 NOT EXISTS 조항 또는 왼쪽 결합 및 필터링 not-NULL 결과에서 기록

가장 좋은 방법은 공통 키를 사용하는 것입니다 (또는 첫 번째 테이블의 키가 두 번째 테이블 키의 주요 부분이되도록하는 것입니다). 이렇게하면 표 2에 존재하지 않는 표 1에서 행을 선택합니다.

가장 좋은 대안은 어떤 방식 으로든 키를 변환 해야하는 경우 표 1에 삽입 트리거를 사용하는 것입니다. 행을 삽입하면 트리거가 발사되고 표 2에 데이터를 삽입 할 수 있습니다. 이것은 단일 트랜잭션을 사용하는 이점과 단점이 있습니다. 데이터 일관성을 유지한다는 것은 이점, Table2가보고에 사용되거나 기타 비 필수 목적으로 사용되는 경우 단점입니다.

행이 삽입되었음을 나타내는 표 1에서 플래그를 사용하기로 결정하지 마십시오. 테이블의 데이터를 테이블을 사용하는 프로세스에 연결하기 때문에 논리적 및 물리적 디자인 모두에서 추악합니다.

자주 사용하는 두 가지 방법이 있습니다. 테이블의 특성에 따라 한 가지 방법이 다른 방법보다 나을 수 있지만 #2를 사용하면 테이블 구조를 개선 할 수있는 기회가있을 수 있습니다.

1.) 테이블이 색인되어 있는지 확인하고 좋은 기본 키가 있는지 확인하십시오. 기본 키가 표 2에 존재하지 않는 표 1에서 모든 레코드를 선택하십시오. 이것은 정규화 된 테이블에 작동합니다

2.) 테이블이 정규화되지 않았고 좋은 키가 없으면 키가 좋은 경우, ProcessedDate를 표 1에 추가 할 수 있습니다. NULL ProcessDate가있는 모든 레코드를 삽입 한 다음 ProcessDate를 현재 DateTime으로 설정하십시오. 표 2에 삽입하는 동안 새로운 기록이 표 1에 삽입되지 않았는지 확인해야합니다.

테이블 구조를 알지 못하면 좋은 답변을 제공하기가 어렵습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top