使用两个表时,SQL在特定条件下获取最大值

时间:2016-02-21 19:05:02

标签: sql oracle

我目前在 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
   );

3 个答案:

答案 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;