2014-10-12 2 views
0

내가 ID (PK)와 테이블이 고정 (정수) 및 기타 열이 많이 비슷한 데이터 행을 얻을 (이름, 내용, 주석, ...)SQL이 여러 행

내가 만들 때 내 데이터의 버전 새 또는 업데이트 된 행에 고정 값이 1 이상인 중복 행이 있는지 확인하고 싶습니다.

ID | Fixed | name 
1 | 2  | "john" 
3 | 1  | "jane" 
4 | 0  | "john" //current row 
5 | 0  | "jane" //current row 

이 쿼리는 나에게 "고정"의 ID 값을 찾을 수 있습니다 :이 될해야 버전 기록을 만든 후

ID | Fixed | name 
1 | 1  | "john" 
2 | 0  | "john" //new row 
3 | 0  | "jane" // updated row 

(고정 값으로 행을 편집하려면, 당신은 더 많은 권한이 필요합니다) 새로운 행 또는 업데이트 된 행의 행 (ID를 미리 알고있는 경우).

select T.ID 
from MyTable T 
inner join (
     select name, 
     comments 
     from MyTable 
     where ID = 2) E 
on T.name = E.name 
and T.comments = E.comments 
where T.fixed = 1 

이 쿼리는 작동하지만 가장 좋은 솔루션이라고 생각하지 않습니다.

1) 나는 모든 새로운 또는 업데이트 된 행이 쿼리를 실행해야합니다 :

나는 다음과 같은 질문/우려가 있습니다. 테이블의 다른 모든 행과 비교할 때마다. 그다지 효율적이지 않습니다. 확실히 더 좋은 방법이 있습니까?

2) 하나의 쿼리에서 모든 ID (2와 3)를 검색하고 일치하는 ID를 반환 할 수 있습니까?

3) 관련 데이터 항목 (예 : 이름) 만 비교해야합니다. 일부 열 (ID, 고정)을 제외한 모든 열을 선택하거나 내부 조인 할 수 있습니까?

답변

1

먼저 조인 것처럼 쿼리를 다시 작성할 수 있습니다 : 성능을 위해, 당신은 MyTable(fixed, name, comments, id)에 인덱스를 원하는

select T.ID 
from MyTable T inner join 
    MyTable e 
    on T.name = E.name and T.comments = E.comments and e.id = 2 
where T.fixed = 1; 

.

NULL 값을 반환하려면 left outer join을 사용하십시오. 목록을 보려면 in :

select T.ID 
from MyTable T left outer join 
    MyTable e 
    on T.name = E.name and T.comments = E.comments and e.id in (2, 3) 
where T.fixed = 1; 
+0

ID가 정수 기본 키 자동 증가로 생성됩니다. 이것은 그것을 색인으로 만들거나 그렇지 않은가? 행 내의 지정된 행의 복제본을 고정 값 1 (또는 그 이상)으로 찾고 싶습니다. 색인이 있으면 도움이되지 않을까요? – user965972

+1

@ user965972 . . 기본 키에는 자동으로 고유 인덱스가 적용됩니다 (사실상). 그러나 ID는 여전히 다른 색인에 포함될 수 있습니다. –

+0

그래서 이름과 설명 (및 다른 데이터) 열을 기반으로 고유하지 않은 색인을 만들 수 있어야합니까? (ID가 아니고 고정되어 있지 않습니다)? e.id에 대한 내부 조인 및 검색 대신 e.id를 나타내는 인덱스 id에 대해 테이블을 검색해야합니까? – user965972