SQL查询:最大数量的枪支

时间:2013-10-23 08:59:39

标签: sql sqlite max

架构如下:

船舶(名称,年份,国家,数量,枪支,枪支,排量)

战斗(战舰,战斗名称,结果)

其中名称和船舶相同。我的意思是,如果'密苏里'是一个元组 名称的结果,'密苏里'也将作为船的元组结果出现。

(即名字='密苏里',船='密苏里州) 它们是相同的

现在我的问题是我要做的SQL语句才能列出 战列舰中的战舰数量最多 枪支(即枪支)

我试过了:

SELECT name, max(gunSize)
FROM Ships

但这给了我错误的结果。

然后我尝试了:

SELECT s.name
FROM Ships s,
   (SELECT MAX(gunSize) as "Largest # of Guns"
   FROM Ships
   GROUP BY name) maxGuns
WHERE s.name = maxGuns.name

然后SQLite Admin给了我一个错误,说没有这样的列'maxGuns'存在 即使我将其指定为别名:maxGuns

你们中的任何人都知道这个问题的正确查询是什么吗? 谢谢!

3 个答案:

答案 0 :(得分:0)

查询中的问题是子查询没有名为name的列。

无论如何,要找到最大量的枪支,只需使用SELECT MAX(gunSize) FROM Ships。 要获得拥有该数量枪支的所有船只,您只需要与该值进行简单比较:

SELECT name
FROM Ships
WHERE gunSize = (SELECT MAX(gunSize)
                 FROM Ships)

答案 1 :(得分:0)

它不存在,因为您尝试在“Where”子句中为子查询设置别名,而不是从表中别名特定列。为了识别具有最多枪支的船,您可以尝试以下方式:

    with cte as (select *
   ,ROW_NUMBER()  over (order by s.gunsize desc) seq
    from ships s )

    select * from cte 
    where seq = '1'

另一种方法可能是:它只会选择第一行,其中包含枪支数量最多的船只。

     select Top 1 *
     from ships s 
     order by s.gunsize desc

答案 2 :(得分:-2)

WITH TAB_SHIPS(NAME, NUMGUNS,DISPLACEMENT) AS (SELECT NAME, NUMGUNS,DISPLACEMENT FROM SHIPS AS S
LEFT JOIN CLASSES AS C
ON S.CLASS=C.CLASS
WHERE C.NUMGUNS >=ALL(SELECT NUMGUNS FROM CLASSES C1 WHERE C1.DISPLACEMENT = C.DISPLACEMENT ) 
UNION
SELECT SHIP, NUMGUNS,DISPLACEMENT FROM OUTCOMES AS O
LEFT JOIN CLASSES AS C
ON C.CLASS=O.SHIP
WHERE C.NUMGUNS >=ALL(SELECT NUMGUNS FROM CLASSES C1 WHERE C1.DISPLACEMENT = C.DISPLACEMENT ) )

SELECT NAME FROM TAB_SHIPS
WHERE NUMGUNS IS NOT NULL