2017-10-11 1 views
1

나는 관계형 스키마를 다음과 같이 제공되었습니다 -이 경우 다중 선택 조작을 수행하는 방법은 무엇입니까?

COUNTRYCODE가 외래 키 w.r.t.가
country (countrycode,name,capital) & 
population (populationcode,population,countrycode) 

관계 국가. 최대 인구로 국가를 계획해야하지만 집계 작업 MAX(population)은 주어진 명령에 대해 직접 작동하지 않습니다. 데이터의 특정 세트에 대한

SELECT pcode, ccode, name, capital 
FROM population NATURAL JOIN country 
WHERE ((SELECT MAX(population) as maxpopulation FROM population NATURAL JOIN country)) 

는 -

INSERT INTO country VALUES(1,'INDIA','NEW DELHI'); 
INSERT INTO country VALUES(2,'U.S.A.','WASHINGTON DC'); 
INSERT INTO country VALUES(3,'U.K.','LONDON'); 
INSERT INTO country VALUES(4,'CHINA','BEIJING'); 
INSERT INTO country VALUES(5,'JAPAN','TOKYO'); 

INSERT INTO population VALUES(1,1200000000,1); 
INSERT INTO population VALUES(2,350000000,2); 
INSERT INTO population VALUES(3,65640000,3); 
INSERT INTO population VALUES(4,1300000000,4); 
INSERT INTO population VALUES(5,127000000,5); 

그 다음, 단말에 출력 제조함에 -

+-------+-------+--------+---------------+ 
| pcode | ccode | name | capital  | 
+-------+-------+--------+---------------+ 
|  1 |  1 | INDIA | NEW DELHI  | 
|  2 |  2 | U.S.A. | WASHINGTON DC | 
|  3 |  3 | U.K. | LONDON  | 
|  4 |  4 | CHINA | BEIJING  | 
|  5 |  5 | JAPAN | TOKYO   | 
+-------+-------+--------+---------------+ 
5 rows in set (0.00 sec) 

와 예정 출력하다 -

+-------+-------+--------+---------------+ 
| pcode | ccode | name | capital  | 
+-------+-------+--------+---------------+ 
|  4 |  4 | CHINA | BEIJING  | 
+-------+-------+--------+---------------+ 
1 rows in set (0.00 sec) 

하지만 그것은 onl이어야합니다. y는 중국인 최대 인구를 가진 나라의 속성을 말해줍니다.

그래서 어떤 종류의 작업을 수행 할 수 있습니까?

+1

NATURAL JOIN 구성을 잊어 버리고 조인 조건을 지정하십시오 !!! – jarlh

+0

예상되는 결과도 지정하십시오! (BTW, 당신은 상관 하위 쿼리가 필요합니다.) – jarlh

+0

@ jarlh 나는 예상 결과를 추가했습니다. –

답변

1

으로 간단하게 :

SELECT pcode, ccode, name, capital 
FROM population NATURAL JOIN country 
WHERE population = (SELECT MAX(population) FROM population) 
+0

답변 해 주신 것에 대해 감사드립니다. 나는 population = (SELECT ....)을 사용해야 만한다는 것을 알지 못했다. WHERE. 다시 한 번 감사드립니다. –

0

WHERE 된 하위 쿼리를 사용하고 LIMIT 기능을 사용합니다.

SELECT p.populationcode, c.countrycode, c.name, c.capital 
FROM population p 
INNER JOIN country c ON p.countrycode = c.countrycode 
WHERE (SELECT countrycode 
     FROM (SELECT countrycode, population 
      FROM population 
      ORDER BY population DESC LIMIT 1)) = c.countrycode 
1

NATURAL JOIN을 사용하지 마십시오. 그것은 동일한 가짜 을 가진 키를 사용하기 때문에 가증스러운 것입니다.. 제대로 선언 된 외래 키 관계를 사용하지도 않습니다. 당신은 단지 하나의 행을 찾는 경우

, 그때 ORDER BYLIMIT를 추천 할 것입니다 : 당신이 최대 인구를 비교 버전을 사용하는 경우, 당신은 중복을 얻을 수

select p.populationcode, p.countrycode, c.name, c.capital 
from population p join 
    country c 
    using (countrycode) -- of course, the traditional explicit "on" is totally correct too 
order by p.population desc 
limit 1; 

. 그것이 당신이 원하는 것이라면, 분명히 그 버전을 사용하십시오.

관련 문제