2011-11-30 3 views
2

주 또는 고유 키 contstraint가 정의되지 않은 MSSQL 테이블로 작업하고 있습니다. 두 개의 필드가 있습니다. xId와 yId를 호출 할 수 있습니다.이 두 필드는 복합 키라고 생각하지만 데이터를 검토하여이를 확인하려고합니다.논리적으로 SQL에서 복합 키를 결정하십시오.

나는 xId와 yId (또는 필요한 세 번째 열 id)의 조합이 논리적으로 결정될 수있는 테이블의 총 레코드 수와 비교할 수있는 SQL 계산 문을 작성할 수 있어야한다고 생각합니다.) 실제로 복합 키 역할을 할 수 있습니다. 그러나 올바른 GROUP BY 또는이를 확인하거나 반증하는 다른 유형의 절을 사용하는 데 문제가 있습니다.

아이디어가 있으십니까?

답변

2

사용 group byhaving :

select xid,yid 
from table 
group by xid,yid 
having count(1) > 1 

이것은 행이 그 좋은 키를 반환있다, 그래서 만약 비 고유 모든 쌍을 표시합니다.

+0

나는이 soultion을 좋아한다. 이제 고유하지 않은 쌍을 검사하여 고유하게 만들기 위해 키에 추가해야 할 항목을 결정할 수 있습니다. 감사! – Paul

2

그냥 테이블의 전체 행 count 수행하고 xidyid 형태의 고유 식별자의 모든 쌍은 다음 두 숫자가 동일합니다 경우 다음

select count(1) 
from(
    select xid,yid 
    from table 
    group by xid,yid 
)a; 

을한다.

다른 방법으로는 최대 규모 수를 xidyid의 고유 한 쌍의 수를 계산하고 찾을 수 :

select max(num_rows) 
from(
    select xid,yid,count(1) as num_rows 
    from table 
    group by xid,yid 
)a; 

과 (xid, yid) 쌍을 형성하는 경우에만 경우이 쿼리의 결과는 1입니다 테이블에 대한 고유 식별자.

+0

내가 찾던 무엇을 그. 나는 너무 가까웠다! 감사! – Paul

+0

@Paul - 오신 것을 환영합니다. –

0

이, YID (있는 경우) XID의 모든 문제 조합을 나열합니다 :

SELECT 
    COUNT(*),xid,yid 
    FROM YourTable 
    GROUP BY xid,yid 
    HAVING COUNT(*)>1 
+0

일반적인 순서대로 count (1)가 count (*)보다 좋습니다. Count는 명명 된 내용이 null 인 행을 생략하므로 모든 셀이 null 인 행이 있으면 생략됩니다. Count (1) –

+1

@jon을 사용하면 약간의 성능 향상을 얻을 것으로 생각합니다. COUNT (*)는 모든 값이 null 인 행을 생략하지 않습니다. 결과 및 성능은 COUNT (1) 또는 COUNT (*)와 동일해야합니다. 또한 문제의 열이 null을 허용하면 키의 일부가 될 수 없습니다. – sqlvogel

관련 문제