반복자가 아닌 세트로 생각하십시오. sql 문은 원하는 출력 세트의 속성을 정의합니다 (일명 테이블 / 관계)
모든 밴드에 대해 해당 국가의 밴드가있어 그 밴드가 해당 장소에서 연주됩니다.
이것의 결과는 (당신의 의도를 올바르게 이해했다면!) 그 장소에서 연주되는 밴드가 하나 이상있는 장소 세트가 될 것입니다. PLAYS 관계에는 이미 원하는 정보가 있으므로 중복을 제거하면됩니다.
따라서 SQL에서는 다음과 같습니다.
select
distinct venueName
from PLAYS
편집 : 좋아, 원하는 실제 세트는 조금 더 복잡합니다. 데이터베이스에 대한 질문은 다음과 같습니다. 모든 국가 에서 어떤 장소가 밴드를 주최 했습니까?
따라서 원하는 세트의 요소에 대한 멤버십 기준을 목표로 정의한 후 뒤로 작업하여 세트를 채 웁니다. 장소는 모든 국가에서 하나 이상의 밴드에 대한 PLAYS 행이있는 경우 출력 세트의 멤버입니다. 이 정보를 어떻게 얻습니까?
한 가지 방법은 각 장소에 대해 다른 국가를 세어 모든 국가의 수와 비교하는 것입니다. 그러나 우리는 COUNTRY 관계가 없습니다. 잠시 동안 주어진 모델에 대해 생각하면 모든 국가 집합이 올바른 기준이 아님을 알 수 있습니다. 밴드가 하나 이상있는 모든 국가의 집합입니다. 따라서 국가 테이블이 필요하지 않습니다 (정규화 된 모델의 경우에는 하나가 있어야하지만). )
declare @BandCountryCount int
select
@BandCountryCount = COUNT(distinct bandCountry)
from BAND
각 공연장의 밴드 국가를 셀 수 있습니다
select
P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
from PLAYS P
inner join BAND B on B.bandName = P.bandName
하위 쿼리를 사용하여 둘을 함께 조각 할 수 있습니다.
select
venueName
from (
select
P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
from PLAYS P
inner join BAND B on B.bandName = P.bandName
) X
where X.VenueBandCountryCount = @BandCountryCount
이제는 가능한 가장 예쁜 쿼리는 아니지만 (GROUP BY 및 HAVING은 임시 변수 및 하위 쿼리보다 더 '우아한'솔루션으로 간주 될 수 있음) 우리가 무엇을했는지는 분명하므로 OP의 목적으로 남겨 두겠습니다. .
OP의 목적은 사고 방식을 명령형에서 선언 형으로 전환하는 방법을 배우는 것이 었습니다. 이를 위해 설명 된 명령 솔루션이 무엇을했는지 살펴보십시오.
이름은 모든 밴드 국가를 반복하고 각 밴드 국가마다 밴드 목록을 가져옵니다. 그들 중 아무것도 플레이스 이름에서 플레이하지 않으면 다음 플레이스 이름으로 이동하십시오. 그렇지 않으면, bandCountries 반복이 끝날 때 개최지 세트를 개최지 세트에 추가하십시오
위의 결정 기준은 무엇입니까? 나는 그것이 생각합니다 :
... 아무도 [특정 국가의 밴드 세트]가 개최지 이름에서 연주하지 않는 경우 ...
이것은 실격 기준 입니다. 명령 적 사고 과정은 전체 버킷으로 시작하여 기준에 맞지 않는 것들을 버리고 있습니다. 우리는하고 필터링 된 데이터를.
간단한 것은 괜찮지 만 원하는 결과 집합을 구성하는 데 도움이됩니다. 버킷을 대신 채울 수 있는 해당 자격 기준 은 무엇 입니까?
- 실격자 : 공연장에서 연주하는 밴드의 밴드가없는 경우, 해당 공연장은 실격 처리됩니다.
- (부분) 한정자 : bandCountry에서 하나 이상의 밴드가 장소에서 연주하는 경우, 장소가 정상일 수 있습니다. 밴드의 나머지 부분을 계속 확인하십시오
- (전체) 예선 : 각 밴드에서 하나 이상의 밴드가 한 장소에서 연주하면 해당 장소는 자격이됩니다.
최종 한정자는 카운트를 사용하여 단순화 할 수 있습니다. 밴드가 하나 이상의 밴드가 공연장에서 연주되는 경우 bandCountry는 '만족'됩니다. 장소에 대한 '만족 된'밴드 국가의 수는 장소가 자격을 갖도록 밴드 국가의 수와 같아야합니다.
이제 탐색을 통해 관계를 넘어 추론 할 수 있습니다.
- VENUE 관계로 시작합니다. [답변에는 필요하지 않지만 관계형 탐색의 개념적 시작점입니다.]
- 개최 장소에서 PLAYS에 가입
- bandCount를 얻으려면 bandName에서 BAND에 가입하십시오.
- 밴드 이름은 신경 쓰지 않습니다. 개최지 이름과 밴드 국가 만 선택하십시오
- 우리는 여분의 bandCountries에 대해서는 신경 쓰지 않습니다. DISTRICT 또는 GROUP BY를 사용하여 중복 제거
- 우리는 이름이 아닌 별개의 밴드 카운트에만 관심이 있습니다.
- 우리는 별개의 bandCountries의 수가 총 bandCountries의 수와 동일한 장소만을 원합니다.
위의 솔루션 (또는 합리적인 팩시밀리)으로 돌아갑니다.
개요
- 이론을 설정하다
- 관계형 탐색 경로
- 포함 대 배타적 기준 (자격과 실격)