架构如下:
船舶(名称,年份,国家,数量,枪支,枪支,排量)
战斗(战舰,战斗名称,结果)
其中名称和船舶相同。我的意思是,如果'密苏里'是一个元组 名称的结果,'密苏里'也将作为船的元组结果出现。
(即名字='密苏里',船='密苏里州) 它们是相同的
现在我的问题是我要做的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
你们中的任何人都知道这个问题的正确查询是什么吗? 谢谢!
答案 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