如何选择从未飞过城市的乘客

brgchamk  于 2022-10-03  发布在  其他
关注(0)|答案(2)|浏览(123)

我将发送一个图像中的数据库描述。

我试过这个选择,但恐怕这不对

SELECT t.type , a.ICAOId , a.name , ci.id , c.ISOAlpha2ID , p.docReference , ti.docReference , ti.number , p.name , p.surname
FROM dbo.AirportType t 
INNER JOIN dbo.Airport a ON t.type = a.type
INNER JOIN dbo.City ci ON a.city = ci.id
INNER JOIN dbo.Country c ON ci.ISOalpha2Id = c.ISOalpha2Id
INNER JOIN dbo.Passenger p ON c.ISOalpha2Id = p.nationality
INNER JOIN dbo.Ticket ti ON p.docReference = ti.docReference
WHERE NOT ci.id = 'Tokyo'

你能帮我把这件事做好吗?enter image description here

knsnq2tg

knsnq2tg1#

您可以创建一个已飞往该市的乘客列表,然后使用该列表作为子查询来选择不在列表中的乘客

我只是想举例说明该如何做

子查询:

SELECT p.id FROM passengers
JOIN tickets t ON p.id = t.passengerID
JOIN city c ON c.id = t.cityID

现在,您只需将其放入另一个选择不在其中的元素的查询中

SELECT * FROM passenger
WHERE id not in ( 
SELECT p.id FROM passengers
JOIN tickets t ON p.id = t.passengerID
JOIN city c ON c.id = t.cityID
WHERE c.name= 'tokyo'
)

请注意,我没有使用您的属性名称,您必须更改这些名称。

这是您必须做的事情的一个简化版本,因为城市不直接在您的门票表中。因此,你还必须加入机票、优惠券和航班,才能让已经飞往一个城市的人。但从那时起,情况是一样的。

总体而言,我相信这应该会帮助你完成你必须做的事情。

zwghvu4y

zwghvu4y2#

没有提供一个最小的可重复性的例子。

这是一个概念性的例子,可以很容易地扩展到一个真实的场景。

SQL

-- DDL and sample data population, start
DECLARE @passenger TABLE (passengerID INT PRIMARY KEY, passenger_name VARCHAR(20));
INSERT @passenger (passengerID, passenger_name) VALUES
(1, 'Anna'),
(2, 'Paul');

DECLARE @city TABLE (cityID INT PRIMARY KEY, city_name VARCHAR(20));
INSERT @city (cityID, city_name) VALUES
(1, 'Miami'),
(2, 'Orldando'),
(3, 'Tokyo');

-- Already visited cities
DECLARE @passenger_city TABLE (passengerID INT, cityID INT);
INSERT @passenger_city (passengerID, cityID) VALUES
(1, 1),
(2, 3);
-- DDL and sample data population, end

SELECT * FROM @passenger;
SELECT * FROM @city;
SELECT * FROM @passenger_city;

;WITH rs AS
(
    SELECT c.passengerID, b.cityID 
    FROM @passenger AS c
        CROSS JOIN @city AS b   -- get all possible combinations of passengers and cities
    EXCEPT  -- filter out already visited cities
    SELECT passengerID, cityID FROM @passenger_city
)
SELECT c.*, b.city_name
FROM rs
    INNER JOIN @passenger AS c ON c.passengerID = rs.passengerID
    INNER JOIN @city AS b ON b.cityID = rs.cityID
ORDER BY c.passenger_name, b.city_name;

输出

乘客ID|Passenger_Name|城市名称
-|-|
1|Anna|Orldando
1|安娜|东京
2|保罗|迈阿密
2|Paul|奥尔丹多

相关问题