[英]Nested SQL Query Guidance
我需要幫助構建一個 SQL 嵌套查詢來解決我要解決的問題。
鑒於這兩個表:
airlines_detail
:
飛機編號 | 航空公司_id | 總座位數 |
---|---|---|
2187 | 425 | 260 |
4361 | 747 | 290 |
3478 | 747 | 270 |
7292 | 425 | 250 |
5833 | 425 | 310 |
3472 | 425 | 300 |
4472 | 747 | 290 |
2624 | 425 | 320 |
Bookings
:
飛機編號 | 預訂 |
---|---|
2187 | 40 |
4361 | 30 |
4361 | 10 |
5833 | 30 |
4361 | 30 |
2624 | 30 |
4472 | 40 |
4472 | 40 |
2624 | 10 |
7292 | 20 |
2187 | 20 |
4472 | 30 |
3478 | 20 |
3472 | 40 |
4472 | 30 |
4472 | 10 |
4361 | 20 |
3478 | 30 |
2187 | 30 |
2187 | 10 |
我需要得到這個結果:
飛機編號 | 航空公司_id | 空座 |
---|---|---|
2187 | 425 | 160 |
7292 | 425 | 230 |
5833 | 425 | 280 |
3472 | 425 | 260 |
2624 | 425 | 280 |
4361 | 747 | 90 |
3478 | 747 | 50 |
4472 | 747 | 150 |
empty_seats
列是booked
列GROUP BY
'd airplane_id
的SUM()
。 我已經成功構建了這個查詢(如下),但我需要JOIN
或以其他方式進行子查詢才能將airline_id
列放入我不清楚的結果中。
重現
-- drop tables if exists
DROP TABLE IF EXISTS airlines_detail;
DROP TABLE IF EXISTS bookings;
-- create airlines_detail table
CREATE TABLE airlines_detail (
airplane_id INTEGER PRIMARY KEY,
airline_id INTEGER NOT NULL,
total_seats INTEGER NOT NULL
);
-- create bookings table
CREATE TABLE bookings (
airplane_id INTEGER NOT NULL,
booked INTEGER NOT NULL,
FOREIGN KEY (airplane_id) REFERENCES airlines_detail(airplane_id)
);
-- insert some airlines_detail values
INSERT INTO airlines_detail VALUES (2187, 425, 260);
INSERT INTO airlines_detail VALUES (4361, 747, 290);
INSERT INTO airlines_detail VALUES (3478, 747, 270);
INSERT INTO airlines_detail VALUES (7292, 425, 250);
INSERT INTO airlines_detail VALUES (5833, 425, 310);
INSERT INTO airlines_detail VALUES (3472, 425, 300);
INSERT INTO airlines_detail VALUES (4472, 747, 290);
INSERT INTO airlines_detail VALUES (2624, 425, 320);
-- insert some bookings values
INSERT INTO bookings VALUES (2187, 40);
INSERT INTO bookings VALUES (4361, 30);
INSERT INTO bookings VALUES (4361, 10);
INSERT INTO bookings VALUES (5833, 30);
INSERT INTO bookings VALUES (4361, 30);
INSERT INTO bookings VALUES (2624, 30);
INSERT INTO bookings VALUES (4472, 40);
INSERT INTO bookings VALUES (4472, 40);
INSERT INTO bookings VALUES (2624, 10);
INSERT INTO bookings VALUES (7292, 20);
INSERT INTO bookings VALUES (2187, 20);
INSERT INTO bookings VALUES (4472, 30);
INSERT INTO bookings VALUES (3478, 20);
INSERT INTO bookings VALUES (3472, 40);
INSERT INTO bookings VALUES (4472, 30);
INSERT INTO bookings VALUES (4472, 10);
INSERT INTO bookings VALUES (4361, 20);
INSERT INTO bookings VALUES (3478, 30);
INSERT INTO bookings VALUES (2187, 30);
INSERT INTO bookings VALUES (2187, 10);
-- fetch some values
-- First, sum up total seats booked by airplane_id
SELECT
airplane_id,
SUM(booked)
FROM bookings
GROUP BY airplane_id;
-- Need to get airline_id in there somehow too
首先,空座位數是座位總數減去預訂座位數。
您的查詢將僅返回在預訂表中至少存在一條記錄的飛機,但您需要為每架飛機返回一條記錄,即使是那些沒有預訂的飛機。
您可以從 Airlines_detail 表中獲取航空公司 ID,然后您可以輕松地將該字段添加到select
列表和group by
。 將其添加到group by
列表不會創建更多組,但必須選擇它。
因此,出於上述兩個原因,查詢應該真正從 Airlines_detail 表開始。
使用如下所示的子查詢:
SELECT airplane_id,
airline_id,
total_seats - (
SELECT COALESCE(SUM(booked), 0)
FROM bookings b
WHERE a.airplane_id = b.airplane_id
) AS empty_seats
FROM airlines_detail a
GROUP BY airplane_id,
airline_id;
COALESCE
用於處理沒有預訂的情況。 在這種情況下,我們要減去值 0,避免NULL
。
另一種方法是在單個查詢中連接兩個表。 由於您想要所有飛機的 output,即使沒有預訂任何東西,此連接也必須是外部連接。
所以:
SELECT a.airplane_id,
a.airline_id,
a.total_seats - SUM(b.booked) AS empty_seats
FROM airlines_detail a
LEFT JOIN bookings b
ON a.airplane_id = b.airplane_id
GROUP BY a.airplane_id,
a.airline_id;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.