我目前在 Oracle 数据库中有以下两个表。
Table Continent with fields:
| CONTINENT | CONTINENTNAME |
Table Land with fields:
| LANDCODE | LANDNAME | CONTINENT | NUMBEROFLANGUAGES |
我想显示大陆名称,地名和语言数量。在以下条件下:从每个大陆显示语言数量最多的土地名称。
当前结果 我得到了这个查询,它将显示世界上语言最多的国家/地区:
CONTINENTNAME | LANDNAME | NUMBEROFLANGUAGES
--------------------------------------------
Asia | India | 26
只有我这里只有一个大陆,而不是世界上所有大陆。我在这里使用错误的方法还是我在解决这个问题时接近?我很想知道如何解决这个SQL难题。
使用过的查询
SELECT c.CONTINENTNAME, l.LANDNAME, l.NUMBEROFLANGUAGES
FROM land l
INNER JOIN continent c
ON c.CONTINENT = l.CONTINENT
WHERE l.NUMBEROFLANGUAGES =
( SELECT MAX(l.NUMBEROFLANGUAGES)
FROM land l
);
答案 0 :(得分:1)
你在概念上很接近。我只是将您的SELECT MAX()查询作为连接移动,并根据原始土地表加入。
function fixVerticalArrows(){
var h = ($('.slick-active').find("img").height()/2);
$('.slick-arrow').css('top',h+'px');
}
$(document).ready(function(){
$('.list').slick({
dots: true,
infinite: true,
speed: 300,
slidesToShow: 1,
adaptiveHeight: true
}).on('afterChange',function(event){
fixVerticalArrows();
}).trigger('afterChange');
$(window).resize(function(){
fixVerticalArrows();
})
});
答案 1 :(得分:1)
抱歉,我必须纠正
with max_language as (
SELECT l.CONTINENT, max(l.NUMBEROFLANGUAGES) language_count
FROM land l
group by l.CONTINENT
)
select *
from land l1,
continent c,
max_language ml
where c.CONTINENT = l1.CONTINENT
and l1.continent = ml.continent
and l1.NUMBEROFLANGUAGES = ml.language_count;
答案 2 :(得分:1)
在Oracle中执行此操作的最简单方法是使用聚合和keep
:
SELECT c.CONTINENTNAME,
MAX(l.LANDNAME) KEEP (DENSE_RANK FIRST ORDER BY l.NUMBEROFLANGUAGES DESC) as LANDNAME,
MAX(l.NUMBEROFLANGUAGES) as NUMBEROFLANGUAGES
FROM land l INNER JOIN
continent c
ON c.CONTINENT = l.CONTINENT
GROUP BY c.CONTINENTNAME;
更典型的方法使用分析函数:
SELECT c.CONTINENTNAME, l.LANDNAME, l.NUMBEROFLANGUAGES)
FROM (SELECT l.*,
ROW_NUMBER() OVER (PARTITION BY CONTINENT ORDER BY NUMBEROFLANGUAGES DESC) as seqnum
FROM land l
) l INNER JOIN
continent c
ON c.CONTINENT = l.CONTINENT
WHERE seqnum = 1;