유사한 항목을 제거합니다. 97,98,99,120,135 열의 n + 1 열 값에서 주목할 가치가 있습니다. PK를 무시하고 공통적으로 5 개의 디지트를 가진 모든 행을 제거하려고합니다 :SQL 쿼리 내가 여섯 열이있는 테이블이 나는 SQL 서버 2008</p> <p>에 문제가 일하고
76, 89, 99, 102, 155, 122
11, 89, 99, 102, 155, 122
89, 99, 102, 155, 122, 130
이 경우 알고리즘은 첫 번째 행에서 시작하고 일치하는 다섯 자리가 포함되어 있기 때문에 두 번째 및 세 번째 행을 삭제해야합니다. 첫 번째 행은 지속됩니다.
나는 무차별 적으로 솔루션을 시도했지만 첫 번째 레코드 만 모든 중복을 찾는다면 25 초 이상 걸린다는 것을 의미하므로 전체 테이블을 처리하는 데는 너무 길다 (반복적 인 프로세스 여야 함).
나는 SQL 상당히 새로운 오전하지만 내가 (나는 몇 가지 해결책을 마련했지만 아무도 ...이 최신 시도 충분하지 않았다)와 함께 온 것입니다 :
(나는 원이 ' t는 모든 코드를 포함하지만 방법을 설명 할 것이고, 도움이된다면 더 붙여 넣을 수 있습니다)레코드 n의 자릿수를 변수에 저장하십시오. 한 자리 숫자가 FROM largeTable 인 레코드와 공통 인 모든 레코드를 선택하십시오.
선택한 모든 숫자를 #oneMatch에 삽입하고 [matchingOne]에 일치하는 숫자를 포함시킵니다.
레코드와 공통적으로 하나의 숫자가있는 모든 레코드를 선택하십시오. 임시 테이블에서 '숫자가 공통입니다'! = [matching]. 선택한 모든 자릿수를 #twoMatch에 삽입하고 [matching1] AND [matched2] 포함 ...
#fiveMatch에 삽입 할 때까지 반복하십시오. 큰 테이블에서 #fiveMatch를 삭제하고 레코드 n + 1로 이동
이 솔루션을 구현하는 데 문제가 있습니다. WHERE 절에 따라 일치하는 변수를 어떻게 할당 할 수 있습니까?
-- SELECT all records with ONE matching field:
INSERT INTO #oneMatch (ID_pk, dOne, dTwo, dThree, dFour, dFive, dSix, mOne)
SELECT ID_pk, dOne, dTwo, dThree, dFour, dFive, dSix
FROM dbo.BaseCombinationsExtended
WHERE ([dOne] IN (@dOne, @dTwo, @dThree, @dFour, @dFive, @dSix) **mOne = dOne?
OR [dTwo] IN (@dOne, @dTwo, @dThree, @dFour, @dFive, @dSix) **mOne = dTwo?
OR [dTwo] IN (@dOne, @dTwo, @dThree, @dFour, @dFive, @dSix) **mOne = dThree?
...
OR [dSix] IN (@dOne, @dTwo, @dThree, @dFour, @dFive, @dSix) **mOne = dSix?
)
나는 '가짜'긴 설명을
죄송 여섯 개 쿼리하지만 너무 비효율적입니다 ... 사용하여 위의 수입니다. 어떤 도움을 주셔서 감사합니다 (새로운 솔루션이나 구현 위의 내 시도)이 문제는 저에게 잔소리가 잠시 동안 잔소리되었습니다 ...
정상화를위한 좋은 사례입니다. – JNK
제게 정교하게 주시겠습니까? (RDB는 나의 가장 강한 소송이 아니므로 내 무지를 용서합니다.) 단 하나의 테이블 만 있고 관계가없는 경우 어떻게 정상화 할 수 있습니까? – Cactusman
동일한 행의 필드를 서로 비교하는 경우 관계가 있어야합니다. – JNK