2014-11-24 2 views
2

다른 테이블에서 테이블 열을 업데이트하려고했습니다.여러 행 값을 동일한 행 및 다른 열로 업데이트하십시오.

Person Table

person 표에서 같은 inst_id 여러 연락처 사람이있을 수 있습니다.

나는 테이블의 최근 2 개의 연락처 세부 정보가있는 firm 테이블이 있습니다.

나는 아래와 같은 firm 테이블을 기대하고있다 :

Firm Table

하나의 담당자, person1email1 업데이트가있는 경우. 2 인 경우 모두 업데이트하십시오. 3이 있으면 3 번째를 버립니다.

누군가 나를 도울 수 있습니까?

+0

당신은 무엇을 의미합니까 : * 최신 2 연락처 정보 *? –

+0

2 위가 좋을 것입니다. (가장 높은 ID를 가진). – Sarin

+0

MySQL 또는 SQL Server를 사용하고 있습니까? (tsql 태그가 나타내는대로)? – jpw

답변

2

이 작동합니다 :

;with cte (rn, id, inst_id, person_name, email) as (
    select row_number() over (partition by inst_id order by id) rn, * 
    from person 
    ) 

update f 
set 
    person1 = cte1.person_name, 
    email1 = cte1.email, 
    person2 = cte2.person_name, 
    email2 = cte2.email 
from firm f 
left join cte cte1 on f.inst_id = cte1.inst_id and cte1.rn = 1 
left join cte cte2 on f.inst_id = cte2.inst_id and cte2.rn = 2 

공통 테이블 inst_id에 의해 분할 된 사람이 테이블에 업데이트 번호 행의 소스로 사용 식 (CTE), 다음 업데이트가 CTE가 두 번 조인 (대한 상단 1 및 상단 2).

Sample SQL Fiddle

+0

감사합니다. – Sarin

0

나는 당신이 당신의 데이터베이스 구조를 다시 생각하면,이 업데이트 자신을 귀찮게하지 않아도 생각합니다. 관계형 데이터베이스의 큰 장점 중 하나는 같은 데이터를 여러 테이블에 여러 번 저장할 필요가 없다는 것입니다. 한 가지 종류의 데이터 (예 : 해당 테이블을 사용자 테이블과 같이)에 하나의 테이블을 가지고 참조 할 수 있습니다. 관계 또는 외래 키 등).

예를 들어 무엇이 의미가 있습니까? contactperson1과 contactperson2와 같은 두 가지 속성을 삽입하는 기관의 테이블을 만드는 것이 좋습니다. 이메일과 이름과 같은 모든 연락처 세부 정보는 삽입하지 말고 사람의 기본 키만 입력하고 외래 키로 만듭니다.

ID INSTITUTION_ID NAME  EMAIL 
1  100   abc [email protected] 
2  101   efg [email protected] 
3  101   ijk [email protected] 
4  101   rtw [email protected] 
... 

과 같은 테이블 "기관": : 지금 이메일을 변경하려면

ID CONTACTPERSON1 CONTACTPERSON2 
100  1    NULL 
101  2    3 
... 

그래서 당신은 다음과 비슷한 모습이 될 것입니다 테이블 '사람'을 가지고 주소, 사람의 테이블을 업데이트하십시오. 회사의 테이블을 업데이트 할 필요가 없습니다.

그리고 두 사람의 세부 정보로 원하는 "테이블"을 어떻게 얻습니까? 그냥 쿼리를 만드십시오 :

이 쿼리가 자주 필요하고 "테이블"처럼 액세스하면 뷰로 저장하면됩니다.

+0

조언 주셔서 감사합니다. 하지만이 회사는 사실 큰 유산 테이블입니다. 필자는 사람 테이블 만 만들었고 나의 요구 사항은 새로운 데이터로 회사를 업데이트하는 것입니다. – Sarin

관련 문제