2012-06-03 4 views
0

이 테이블은 GenreSongs입니다. 하나의 장르에서 (분명히) 많은 노래를 가질 수 있고 하나의 노래는 여러 장르에 속할 수 있습니다 (노래 xyz가 있고, 랩에 속하며, 힙합에 속할 수도 있기 때문에 분명히 다 대다 관계가 있습니다)). 이 테이블에는 GenreIDSongID 열이 포함되어 있으므로이 두 테이블을 다 대다 관계 맵으로 사용하는이 테이블 GenreSongs이 있습니다. 그래서, 내가 무엇을 해야하는지이 Genre 테이블에 SongsCount이라는 열을 추가합니다. 여기에는이 장르의 노래 수가 포함됩니다. 나는 지금 select를 기반으로 테이블을 업데이트하는 상관 쿼리

SELECT GenreID, Count(SongID) FROM GenreSongs GROUP BY GenreID 

, 이것은 우리가, 장르마다 곡의 수를 필요로 무엇을 우리에게 제공, 또한 곡의 수를 줄 것이다 쿼리를 생성, 열을 추가 할 테이블을 변경할 수 있습니다,하지만 난이 방법을 사용할 수 있습니다 쿼리를 사용하여 만든 열을 업데이트하십시오 ( SongsCount). 한 가지 방법은이 쿼리를 실행하고 결과를 확인한 다음 해당 열을 수동으로 업데이트하는 것입니다. 그러나 모든 사람들이 그 방법을 프로그래밍 방식으로 동의하지 않을 것이라고 확신합니다. 외부 쿼리에서 GenreID의 값을 얻은 다음 내부 쿼리 (상관 쿼리)에서 해당 값을 계산하지만 하위 쿼리로 하위 쿼리를 만들 필요가 있다고 생각하게되었습니다. 어느 누구도 이걸 만들 수 있니?

+0

다른 사람들을 향한 기본적인 예의로서 당신을 도운다면 대답을 받아들이는 것을 잊지 마십시오 ... –

답변

0

이 문제를 접근하는 방법의 문제는 데이터의 크기와 빈도에 따라 달라집니다 업데이트됩니다. 다음은 몇 가지 시나리오입니다.

노래가 자주 업데이트되고 테이블이 꽤 큰 경우 Genre에 열을 포함시키고 Songs 테이블에서 트리거를 사용하여 열을 업데이트 할 수 있습니다.

또는 장르의 GenreSong 테이블에 인덱스를 만들 수 있습니다. 그런 다음 쿼리는

select count(*) 
from GenreSong gs 
where genre = <whatever> 

으로 매우 빠르게 실행되어야합니다.

노래가 자주 업데이트되지 않거나 배치 (예 : 야간 또는 주간)에 업데이트되는 경우 노래의 수를 배치의 일부로 업데이트 할 수 있습니다. 검색어는 다음과 같을 수 있습니다.

update Genre 
    set SongCnt = cnt 
    from (select Genre, count(*) as cnt from GenreCount gc group by Genre) gc 
    where Genre.genre = gc.Genre 

그리고 또 다른 가능성은 값을 저장하지 않아도된다는 것입니다. 즉석에서 계산을 수행하는 뷰/쿼리의 일부로 만들 수 있습니다.

관계형 데이터베이스는 매우 유연하며 종종 여러 가지 방법으로 작업을 수행합니다. 올바른 접근 방식은 달성하고자하는 목표에 크게 좌우됩니다.

+0

고맙습니다. 매우 유익했습니다. – Razort4x

0

SongsCount라는 테이블을 만드는 것은 잘못된 디자인입니다 (중복 데이터 및 업데이트 오버 헤드). 복수의 결과에 대한

SELECT ID, ..., (SELECT Count(*) FROM GenreSongs WHERE GenreID = X) AS SongsCount FROM Genre WHERE ID = X 

그리고이 (훨씬 더 효율적) 대신이 하나의 결과에 대한 쿼리를 사용

SELECT ID, ..., SongsCount FROM (SELECT GenreID, Count(*) AS SongsCount FROM GenreSongs GROUP BY GenreID) AS sub RIGHT JOIN Genre AS g ON sub.GenreID = g.ID 
관련 문제