[英]postgreSQL - Incorrect query results
我有以下兩個查詢:
Return the number of flights for each manufacturer:
SELECT COUNT(flight) AS num_flights, manufacturer
FROM flights, planes
WHERE flights.tailnum = planes.tailnum
GROUP BY manufacturer
ORDER BY num_flights DESC
返回(此處並非所有結果都可見,總共 27 行):
-------------+---------------------------------+--+--+--+
| num_flights | manufacturer | | | |
+-------------+---------------------------------+--+--+--+
| 67623 | "BOEING" | | | |
+-------------+---------------------------------+--+--+--+
| 36244 | "AIRBUS INDUSTRIE" | | | |
+-------------+---------------------------------+--+--+--+
| 11676 | "AIRBUS" | | | |
+-------------+---------------------------------+--+--+--+
| 8932 | "MCDONNELL DOUGLAS AIRCRAFT CO" | | | |
+-------------+---------------------------------+--+--+--+
| 4856 | "EMBRAER" | | | |
+-------------+---------------------------------+--+--+--+
| 3998 | "MCDONNELL DOUGLAS" | | | |
+-------------+---------------------------------+--+--+--+
| 1259 | "MCDONNELL DOUGLAS CORPORATION" | | | |
+-------------+---------------------------------+--+--+--+
| 247 | "CESSNA" | | | |
+-------------+---------------------------------+--+--+--+
| 162 | "PIPER" | | | |
+-------------+---------------------------------+--+--+--+
| 65 | "BELL" | | | |
+-------------+---------------------------------+--+--+--+
| 63 | "DEHAVILLAND" | | | |
+-------------+---------------------------------+--+--+--+
| 63 | "FRIEDEMANN JON" | | | |
+-------------+---------------------------------+--+--+--+
| 55 | "STEWART MACO" | | | |
+-------------+---------------------------------+--+--+--+
| 54 | "LAMBERT RICHARD" | | | |
+-------------+---------------------------------+--+--+--+
| 51 | "KILDALL GARY" | | | |
+-------------+---------------------------------+--+--+--+
| 47 | "BEECH" | | | |
+-------------+---------------------------------+--+--+--+
| 44 | "MARZ BARRY" | | | |
+-------------+---------------------------------+--+--+--+
| 42 | "AMERICAN AIRCRAFT INC" | | | |
+-------------+---------------------------------+--+--+--+
| 40 | "LEBLANC GLENN T" | | | |
+-------------+---------------------------------+--+--+--+
| 32 | "AGUSTA SPA" | | | |
+-------------+---------------------------------+--+--+--+
| 27 | "SIKORSKY" | | | |
+-------------+---------------------------------+--+--+--+
| 25 | "PAIR MIKE E" | | | |
+-------------+---------------------------------+--+--+--+
| 22 | "DOUGLAS" | | | |
+-------------+---------------------------------+--+--+--+
| 19 | "LEARJET INC" | | | |
+-------------+---------------------------------+--+--+--+
| 18 | "AVIAT AIRCRAFT INC" | | | |
+-------------+---------------------------------+--+--+--+
| 17 | "HURLEY JAMES LARRY" | | | |
+-------------+---------------------------------+--+--+--+
| 13 | "GULFSTREAM AEROSPACE" | | | |
+-------------+---------------------------------+--+--+--+
還有一個:
Return manufacturers with more than 200 planes:
SELECT COUNT(tailnum) AS num_planes, manufacturer
FROM planes
GROUP BY manufacturer
HAVING COUNT(*) > 200
ORDER BY num_planes DESC
返回:
+------------+--------------------+
| num_planes | manufacturer |
+------------+--------------------+
| 1630 | "BOEING" |
+------------+--------------------+
| 400 | "AIRBUS INDUSTRIE" |
+------------+--------------------+
| 368 | "BOMBARDIER INC" |
+------------+--------------------+
| 336 | "AIRBUS" |
+------------+--------------------+
| 299 | "EMBRAER" |
+------------+--------------------+
現在我正在嘗試查詢擁有超過 200 架飛機的每個制造商的航班數量。
編寫了以下查詢:
SELECT COUNT(flight) AS num_flights, pl.manufacturer
FROM flights fl, planes pl JOIN
(SELECT COUNT(tailnum) AS num_planes, pl2.manufacturer
FROM planes pl2
GROUP BY pl2.manufacturer
HAVING COUNT(*) > 200
ORDER BY num_planes DESC) tm
ON pl.manufacturer = tm.manufacturer
GROUP BY pl.manufacturer
ORDER BY num_flights DESC
但是,此查詢返回的航班數量不正確,並且需要很長時間才能執行:
+-------------+--------------------+
| num_flights | manufacturer |
+-------------+--------------------+
| 262029020 | "BOEING" |
+-------------+--------------------+
| 64301600 | "AIRBUS INDUSTRIE" |
+-------------+--------------------+
| 59157472 | "BOMBARDIER INC" |
+-------------+--------------------+
| 54013344 | "AIRBUS" |
+-------------+--------------------+
| 48065446 | "EMBRAER" |
+-------------+--------------------+
我在這里做錯了什么?
表結構:
planes:
CREATE TABLE planes
(
tailnum VARCHAR(6),
manufacturer VARCHAR(50)
)
+----------+--------------------+
| tailnum | manufacturer |
+----------+--------------------+
| "N10156" | "EMBRAER" |
+----------+--------------------+
| "N102UW" | "AIRBUS INDUSTRIE" |
+----------+--------------------+
| "N103US" | "AIRBUS INDUSTRIE" |
+----------+--------------------+
| "N104UW" | "AIRBUS INDUSTRIE" |
+----------+--------------------+
| "N10575" | "EMBRAER" |
+----------+--------------------+
| "N105UW" | "AIRBUS INDUSTRIE" |
+----------+--------------------+
| "N107US" | "AIRBUS INDUSTRIE" |
+----------+--------------------+
| ... | ... |
+----------+--------------------+
flights:
CREATE TABLE flights
(
flight INT,
tailnum VARCHAR(6)
)
+--------+----------+
| flight | tailnum |
+--------+----------+
| 1545 | "N14228" |
+--------+----------+
| 1714 | "N24211" |
+--------+----------+
| 1141 | "N619AA" |
+--------+----------+
| 461 | "N668DN" |
+--------+----------+
| 1696 | "N39463" |
+--------+----------+
| ... | ... |
+--------+----------+
您可以試試這個(通過 tailnum 加入飛機和航班),計算 tailnums 和按制造商分組的航班,並通過在COUNT(tailnum)
上的子句進行過濾。
SELECT manufacturer AS "Manufacturer",
COUNT(DISTINCT tailnum) AS "Number of planes",
COUNT(flights) as "Number of flights",
FROM planes
INNER JOIN flights
ON (planes.tailnum=flights.tailnum)
GROUP BY manufacturer
HAVING COUNT(DISTINCT tailnum)>200
ORDER BY 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.