2016-07-15 2 views
1

연락처를 회사에 연결하는 테이블이 있습니다. 연락처가 하나 이상 추가되면 "기본"또는 "보조"연락처를 설정하는 옵션이 있습니다. 그러나 사람들이 연락처를 추가 할 때이 기능을 사용하지 않았습니다. 프로그램이 수정되어 회사에 추가 된 첫 번째 연락처가 기본으로 표시되지만 이미 입력 된 데이터는 수정되지 않습니다.SQL : 열을 기준으로 고유 한 행 업데이트

나는이 테이블을 폴링하고 CompanyID 당 하나의 레코드 만있는 경우 PrimaryContact를 true로 설정하지만이 작업을 수행하는 방법을 알 수는 없다고 말합니다. 할당 된 연락처가 둘 이상있는 회사의 경우 아무 것도하고 싶지 않습니다. 예 :

CompanyID ContactID PrimaryContact 
1   285   0 
2   375   0 
3   761   0 
4   1744  0 
4   2301  0 
6   335   0 
6   4987  0 
9   809   0 
9   2119  0 
10   99   0 
11   99   0 

위의 예에서 CompanyID 4, 6 및 9에는 여러 항목이 있으므로 필자는이를 만지지 않습니다. 하지만 1, 2, 3, 10 및 11은 단일 항목을 가지므로 PrimaryContact를 해당 행에 대해 1로 설정하려고합니다.

어떻게이 작업을 수행 할 수 있습니까?

update contacts 
set PrimaryContact = 1 
where CompanyID in (
    select CompanyID 
    from contacts 
    group by CompanyID 
    having count(distinct ContactID) = 1 
) 

문제는 이전의 MySQL로 태그 된 아래의 원래의 대답은 그에게 적응 :

+0

내 이전 쿼리가 잘못, 업데이트 연락처 PrimaryContact = 설정 (C1)이 쿼리를 시도 할 경우 ((SELECT COUNT (1) 연락처 (C2)의 경우 c2.CompanyID에 의해 c2.CompanyID = c1.CompanyID 그룹) > 1, 0, 1) –

답변

1

당신은 MS SQL 서버에 대해 원하는 구문이 있습니다. 파생 테이블에서

update contacts as c 
inner join 
(
    select CompanyID 
    from contacts 
    group by CompanyID 
    having count(distinct ContactID) = 1 
) t on c.CompanyID= t.CompanyID 
set PrimaryContact = 1; 

당신이 하나의 ContactID가가있는 CompanyIDs을 찾을 :

그것을 할 수있는 한 가지 방법이다. 해당 쿼리의 결과는 업데이트해야하는 테이블과 조인됩니다.

Sample SQL Fiddle

+0

내부 조인 후 select 문은 단일 항목 (1,2,3,10 및 11)이있는 행을 올바르게 식별하지만 MS SQL Server에서 전체적으로 작동하도록 업데이트를 가져올 수 없습니다 Management Studio (2014). 그것은 "as c"부분을 좋아하지 않는 것 같습니다. 그래서 테이블에 대한 쿼리를 실행 한 다음 tCompanyIDs라는 새 테이블에 결과를 복사 한 후 "CompanyID"필드 만 사용했습니다. 그런 다음 쿼리에서 사용했습니다 : – Allan

+0

@Allan [tag : MySQL] 태그를 사용하여 질문에 태그를 추가했으며 내 대답의 구문이 해당 데이터베이스에 맞게 조정되었습니다. MS SQL Server를 사용하고 있다면 질문에서 태그를 바꾸면 대답을 업데이트 할 것입니다. – jpw

+0

MySQL 예제를 사용하더라도 작동하도록 수정 할 수 있었지만 SQL Server 버전을 게시 해 주셔서 감사합니다 ... 다시 올 것이라고 확신합니다. – Allan

관련 문제