簡體   English   中英

嵌套 SQL 查詢指導

[英]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列是bookedGROUP BY 'd airplane_idSUM() 我已經成功構建了這個查詢(如下),但我需要JOIN或以其他方式進行子查詢才能將airline_id列放入我不清楚的結果中。

重現

  1. Go 到https://www.mycompiler.io/new/sql
  2. 復制並粘貼下面的代碼並運行它來看看我到目前為止有什么
-- 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM