b***i 发帖数: 3043 | 1 题目是sqlzoo.net的 4 Select within Select的第八题, 列出所有比本洲其他国家人
口多三倍以上的国家和所在洲。
终于做出来,用了4个select, 两次join, 但是有必要这么麻烦吗?
我的思路是,先选出来每个洲的最多人口,然后把这些洲的有多于最大人口1/3的国家
所在洲列出来,
然后再列出来不在上述表中的洲,和最大人口
最后把该国家和洲列出来。
做了一天,险些心脏病发作,幸亏今天踢了足球。 |
b********9 发帖数: 159 | 2 oh don't be dramatic :-) consider using cte.
【在 b***i 的大作中提到】 : 题目是sqlzoo.net的 4 Select within Select的第八题, 列出所有比本洲其他国家人 : 口多三倍以上的国家和所在洲。 : 终于做出来,用了4个select, 两次join, 但是有必要这么麻烦吗? : 我的思路是,先选出来每个洲的最多人口,然后把这些洲的有多于最大人口1/3的国家 : 所在洲列出来, : 然后再列出来不在上述表中的洲,和最大人口 : 最后把该国家和洲列出来。 : 做了一天,险些心脏病发作,幸亏今天踢了足球。
|
B*****g 发帖数: 34098 | 3 你想的太多了,一个简单的not exsits全解决
select name,continent
from world a
where population is not null
and not exists (select *
from world b
where b.continent = a.continent
and b.name != a.name
and 3*b.population > a.population)
【在 b***i 的大作中提到】 : 题目是sqlzoo.net的 4 Select within Select的第八题, 列出所有比本洲其他国家人 : 口多三倍以上的国家和所在洲。 : 终于做出来,用了4个select, 两次join, 但是有必要这么麻烦吗? : 我的思路是,先选出来每个洲的最多人口,然后把这些洲的有多于最大人口1/3的国家 : 所在洲列出来, : 然后再列出来不在上述表中的洲,和最大人口 : 最后把该国家和洲列出来。 : 做了一天,险些心脏病发作,幸亏今天踢了足球。
|
s**********o 发帖数: 14359 | 4 不用SELECT *, SELECT TOP 11即可
【在 B*****g 的大作中提到】 : 你想的太多了,一个简单的not exsits全解决 : select name,continent : from world a : where population is not null : and not exists (select * : from world b : where b.continent = a.continent : and b.name != a.name : and 3*b.population > a.population)
|
B*****g 发帖数: 34098 | 5 要用标准西口好吧。oracle里,select啥效率结果都一样
【在 s**********o 的大作中提到】 : 不用SELECT *, SELECT TOP 11即可
|
b***i 发帖数: 3043 | 6 数据库不是我的茶,有点FP的感觉
【在 B*****g 的大作中提到】 : 你想的太多了,一个简单的not exsits全解决 : select name,continent : from world a : where population is not null : and not exists (select * : from world b : where b.continent = a.continent : and b.name != a.name : and 3*b.population > a.population)
|
a*********0 发帖数: 41 | 7 select name, continent from world w1
where population/3 >= all
(select population from world w2
where w1.continent = w2.continent
and w1.name <> w2.name)
子查询基本就是找同continent的max |