2017-09-27 16 views
1

내 문제 :
예상치 못한 경우 계속해서 여러 값을 반환합니다. 나는 국가, 군 및 국가에 의해 결정된 특정한 기후를 얻는 것을 시도하고있다.1 개 이상의 값을 반환하는 SQL 하위 쿼리

내가 시도한 것 :
아래 코드를 작성하십시오. 나는 그것이 구체적으로 무엇이 잘못되었는지 확신 할 수 없다. I 은 여러 값을 반환한다는 것을 알고 있습니다. 하지만 왜? 나는 STATE_ABBREVIATION = PROV_TERR_STATE_LOC을 지정하고 inner join을 사용하여 다른 CLIMATE_ID를 제외하고 유사한 행을 생성하면 안됩니까?

SELECT 
...<code>... 
    (SELECT locations.CLIMATE_ID 
     FROM REF_CLIMATE_LOCATION locations, SED_BANK_TST.dbo.STATIONS stations 
     INNER JOIN REF_STATE states ON STATE_ID = states.STATE_ID 
     INNER JOIN REF_COUNTY counties ON COUNTY_ID = counties.COUNTY_ID 
     INNER JOIN REF_COUNTRY countries ON COUNTRY_ID = countries.COUNTRY_ID 
     WHERE STATE_ABBREVIATION = PROV_TERR_STATE_LOC) AS CLIMATE_ID 
...<more code>... 
FROM SED_BANK_TST.dbo.STATIONS stations 

나는 시간이에 있었다 SO에 다른 질문을 찾고, 그러나 나는이 하위 쿼리가 하나의 값을 반환하는 방법을 알아낼 수 없습니다했습니다.

+2

예제 데이터와 전체 테이블 스키마가있을 수 없습니다. 해당 쿼리가 단일 값을 반환하도록하는 모든 종류의 방법이 있지만 올바른 방법이 무엇인지 알 수있는 방법은 없습니다. – squillman

+0

테스트중인 ID가 REF 테이블에있는 경우 이러한 내부 조인은 결과 집합을 축소하지 않습니다. – Ronald

답변

1

테스트중인 ID가 REF 테이블에있는 경우 이러한 내부 조인으로 결과 집합이 줄어들지 않습니다. 그 외에도 위치와 스테이션 (where 절로 인해 구형 내부 조인이 될 수 있음)간에 카티 전 곱을 수행하고 있습니다. 당신은 단지 STATE_ABBREVIATION = PROV_TERR_STATE_LOC

0

하신 위치의 계층 구조를 보여 조인 한 상태에서 방송국 테이블의 단일 행과 일치하는 위치 테이블에 단일 행이있는 경우

당신은 단지 하나의 행을 얻을 것이다 : Country-> State-> County이지만 WHERE 절은 주 약어로만 제한됩니다. 카운티에 가입하면 해당주의 모든 카운티에 대해 하나의 기록을 얻을 수 있습니다. 당신은 결과의 TOP 1을 취하여 결과를 제한 할 수 있지만, 그것이 정말로 당신이 원하는 것이기 때문에 매우 조심해야합니다. 특정 카운티를 찾고 있다면 WHERE 절에 그 카운티를 포함시켜야합니다. ORDER BY 절을 기반으로 상위 1 개를 제공한다는 점에서 TOP 1로 제어 할 수 있습니다. 당신이 가장 최근에 추가 된, 사용하려는 경우 즉, : 귀하의 하위 쿼리에 대한

SELECT TOP 1 [whatever] ORDER BY [DateCreated] DESC; 

을, 당신은 같은 것을 할 수 있습니다

SELECT TOP 1 
    locations.CLIMATE_ID 
FROM REF_CLIMATE_LOCATION locations , 
     SED_BANK_TST.dbo.STATIONS stations 
     INNER JOIN REF_STATE states ON STATE_ID = states.STATE_ID 
     INNER JOIN REF_COUNTY counties ON COUNTY_ID = counties.COUNTY_ID 
     INNER JOIN REF_COUNTRY countries ON COUNTRY_ID = countries.COUNTRY_ID 
WHERE STATE_ABBREVIATION = PROV_TERR_STATE_LOC 

그냥 말에 의해 주문을 추가하거나 확인 또는 테이블에있는 "자연 질서"에 기초하여 TOP 1을 선택하는 것이 좋습니다.

0

하위 쿼리에서 단일 값을 원할 경우 아마도 DISTINCT을 사용해야합니다. 가장 좋은 방법은 하위 쿼리를 개별적으로 실행하고 결과를 확인하는 것입니다. 사용한 테이블의 다른 열을 포함해야하는 경우 결과에 여러 행이 포함되어 있는지 확인하기 위해 그렇게 할 수 있습니다.

또한 MAX() 또는 MIN() 또는 TOP 1가 하위 쿼리에서 하나의 값을 얻기 위해 사용할 수 있지만 이것은 당신이 locations.CLIMATE_ID을 위해 달성하고자하는 논리에 따라 달라집니다. "나머지 열과 어떻게 관련이 있습니까?"라는 질문에 대답해야합니다.