2017-05-04 2 views
3

다음 표가 있습니다.2 테이블 (SQL)의 열 비교를 기반으로 테이블 열 업데이트

표 1

Id | Values | Counts 
1 | rock | 0 
2 | tina | 0 
3 | alex | 0 

표 2

Id | Values 
1 | rock 
2 | alex 
3 | alex 
4 | rock 
5 | rock 
6 | tina 

당신이 볼 수있는 바와 같이, 표 1은 바위, 티나와 알렉스와 같은 값이 포함되어 있습니다. 이 열은 항상 고유 한 값을가집니다. Counts 열은 표 2의 'rock'수를 확인하고 Counts 열에서 업데이트해야합니다. 예를 들어 암석은 표 2에 3 번 표시됩니다. 암석에 대한 계수는 3이어야합니다.

다른 값과 비슷합니다. 누군가가 내게 SQL을 사용하여 이것을 달성 할 수있는 알려주 pls 수 있습니다. 최종 테이블의 모습입니다. 어떤 도움 이해 1

Id | Values | Counts 
1 | rock | 3 
2 | tina | 1 
3 | alex | 2 

표. 온라인으로 검색했는데이 시나리오에서 가능한 해결책을 찾지 못했습니다. 상관 하위 쿼리를 사용하여 SQL Server에서

+2

MySQL 또는 SQL Server? – ollie

+0

SQL Server ollie .. – Rihana

답변

1

일반적으로 두 테이블 사이에 JOIN을 사용하여 Table1의 값으로 Table1을 업데이트 할 수 있습니다 (또는 브리지 테이블을 더 사용하는 경우).그러나

UPDATE t1 
SET t1.dataColumn = t2.dataColumn 
FROM Table1  t1 
INNER JOIN Table2 t2 ON t1.keyColumn = t2.keyColumn 

, 당신은 두 번째 테이블의 하위 쿼리를 활용에서이 실행하는 하위 쿼리

UPDATE t1 
SET t1.Counts = sb.Counts 
FROM Table1 AS t1 
INNER JOIN (
    SELECT [values], Counts = Count([values]) 
    FROM  Table2 
    GROUP BY [values] 
    ) AS sb 
ON t1.[values] = sb.[values] 

에 가입 수행해야합니다 (예 : 개수, 합계 등) 집계 기능을 사용하는 테이블이 나에게이 준 :

테이블 디자인에 관한
SELECT * FROM Table1 

id values counts 
---- ------- ------- 
1  rock  3 
2  tina  1 
3  alex  2 

한 가지; 일반적으로 테이블, 열 또는 다른 데이터베이스 개체의 이름을 지정할 때는 예약어/특수/키워드를 사용하지 않는 것이 좋습니다. 또한 테이블을 서로 연결할 때 혼동을 줄 수 있기 때문에 심지어 idTable1이 훨씬 쉽게 만들 수 있기 때문에 일반 이름 id을 사용하지 마십시오.

1

:

update t1 
set t1.Counts = (
    select count(*) 
    from t2 
    where t2.[Values] = t1.[Values] 
    ); 

rextester 데모 : MySQL의에서 http://rextester.com/SBYNB72372

, 상관 하위 쿼리 사용 :

update t1 
set t1.Counts = (
    select count(*) 
    from t2 
    where t2.`Values` = t1.`Values` 
    ); 

rextester 데모 : http://rextester.com/DDDC21719


t1 테이블에 저장되는 대신 view에서 더 잘 계산 될 수 있습니다. SQL 서버에서

:

create view dbo.t1_with_counts as 
select t1.Id, t1.[Values], count(t2.[Values]) as Counts 
from t1 
    left join t2 
    on t1.[Values] = t2.[Values] 
group by t1.Id, t1.[Values] 
go 
select * 
from dbo.t1_with_counts; 

MySQL의에서 :

create view t1_with_counts as 
select t1.Id, t1.`Values`, count(t2.`Values`) as Counts 
from t1 
    left join t2 
    on t1.`Values` = t2.`Values` 
group by t1.Id, t1.`Values`; 

select * 
from t1_with_counts; 
1

는 그와 같은 테이블에서 카운트를 추적의 지혜에 의문을 제기한다. 이로 인해 관계형 데이터베이스 구조와 관리가 불량합니다. 대신, 나는 당신이보기 사용할 수를 볼 필요가 때마다, 표 1에서 count 열을 제거 제안이 정적보기 대신 데이터를 동적으로 업데이트보기 결과

SELECT t1.ID, t1.VALUES, COUNT(t2.ID) AS VALUE_COUNT 
FROM TABLE1 t1 LEFT JOIN TABLE2 t2 ON t1.VALUES = t2.VALUES 

을 그 당신이 그것을 깨닫지 못해서 썩어 갈 가능성이 있습니다.

+0

모두 상황에 따라 다릅니다. 이 샘플에서 나는 당신과 동의 할 것입니다. 이 함수가 자주 호출되고 수천 개의 행이 있으면 특히 인덱스가없는 경우 성능 문제가 될 수 있습니다. –