2013-10-23 37 views
0

模式如下:SQL查詢:槍支數量最多的

船舶(姓名,yearLaunched,國家,numGuns,gunSize,位移)

戰役(船,battleName,結果)

其中name和船是平等的。通過這個我的意思是如果'密蘇里'是名稱的結果 結果之一,'密蘇里'也將出現作爲船舶的元組結果。

(即名稱=「密蘇里」,船=「密蘇里州) 它們是同

現在我的問題是什麼SQL語句我會做,以列出其中包括戰列艦列表 戰艦有我試過槍(即gunSize)

量最大 :

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的管理員給了我一個錯誤,說沒有這樣的列「maxGuns」存在,即使 我賦予它一個別名:maxGuns

做任何你知道這個問題的正確查詢是什麼? 謝謝!

+0

爲什麼你提了'Battles'表?它似乎與這個問題沒有關係。 –

回答

0

查詢中的問題是子查詢沒有名爲name的列。

無論如何,要找到最大數量的槍,只需使用SELECT MAX(gunSize) FROM Ships。 要獲得所有附帶了數槍,你需要比與該值進行簡單的比較而已:

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

完美。謝謝您的幫助! –

0

它不存在,因爲你試圖別名「去哪兒」子句中的子查詢,而不是來自表格的別名專用列。爲了用最槍,以確定船上,你可以嘗試這樣的:

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 
+0

這不適用於SQLite。這個問題要求所有*槍支最多的船隻。 –

-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