我有以下问题:
让我们考虑一个社交网络场景:同一次邮轮旅行中的乘客被认为是“朋友”,找到道格拉斯的朋友的朋友。
我尝试使用以下代码解决它,但它无法正常工作。它将归还道格拉斯和他的朋友,而不是道格拉斯朋友朋友的巡洋舰。
SELECT PASSENGERNUM
FROM VOYAGE
WHERE CRUISENUM
IN (
SELECT CRUISENUM
FROM VOYAGE
WHERE PASSENGERNUM
IN (
SELECT PASSENGERNUM
FROM PASSENGER
WHERE PASSENGERNAME != 'Douglas'
AND PASSENGERNAME
IN (
SELECT PASSENGERNAME
FROM PASSENGER
WHERE PASSENGERNUM
IN (
SELECT PASSENGERNUM
FROM VOYAGE
WHERE CRUISENUM
IN (
SELECT CRUISENUM
FROM VOYAGE
WHERE PASSENGERNUM
IN (
SELECT passengernum
FROM PASSENGER
WHERE passengername = 'Douglas'
)
)
)
)
)
)
这是我得到的道格拉斯和他的朋友只有乘客而不是道格拉斯的朋友passangernum
PASSENGERNUM
11797
11797
11797
12345
12345
这是数据库表(乘客,航程): http://i.stack.imgur.com/S0I8D.png
答案 0 :(得分:0)
你会想要这样的东西:
select p2.*
from passenger p1
inner join voyage v1
on p1.passengernum = v1.passengernum
inner join voyage v2
on v1.cruisenum = v2.cruisenum
inner join voyage v3
on v2.passengernum = v3.passengernum and v2.passengernum <> p1.passengernum
inner join voyage v4
on v3.cruisenum = v4.cruisenum and v4.cruisenum <> v1.cruisenum
inner join passenger p2
ON v4.passengernum = p2.passengernum
where p1.passengername = 'douglas' and v4.passengernum <> v2.passengernum;
以下是一个例子:http://sqlfiddle.com/#!9/d59b9/15。我没有声称这是完美的或优化的,但它看起来能给出正确的结果。