sql选择所有记录

时间:2016-12-02 20:29:35

标签: mysql sql sql-server join subquery

所以有3个表

1 passanger detail

2预订

3次飞行

通勤

+----+------+
| id | name |
+----+------+
|  1 | A    |
|  2 | B    |
|  3 | C    |
+----+------+

预订

+----+-------+
| id |flight |
+----+-------+
|  1 |   101 |
|  1 |   102 |
|  1 |   103 |
|  2 |   101 |
|  3 |   104 |
|  2 |   105 |
+----+-------+

飞行

+--------+------+
| flight | late |
+--------+------+
|    101 |   80 |
|    102 |   80 |
|    103 |   80 |
|    104 |   10 |
|    105 |   10 |
+--------+------+

表1包含传递者ID和姓名

表2包含passanger id及其航班ID

表3包含航班ID和延迟多少分钟

现在我想找出所有航班延迟50分钟或更长时间的乘客姓名

所以输出为A因为101 102和103晚80分钟

不是B,因为101晚了80分钟,但105晚了10分钟(并非所有b的航班晚到50分)

所以我的方法是

select name from passanger,booking where passanger.id=booking.id and booking.flight = ALL (select flight.flight from flight where flight.late>50)

无法获得所需的输出。

3 个答案:

答案 0 :(得分:1)

您可以按名称进行分组,并检查乘客的所有航班是否都迟到having条件。

select p.name 
from passanger p
join booking b on p.id=b.id
join flight f on f.flight = b.flight 
group by p.name
having count(*) = count(case when f.late>50 then f.flight end)

答案 1 :(得分:0)

试试这个:

select name from passanger, booking
where passanger.id = booking.id 
and booking.flight in (select flight.flight from flight 
                       where flight.late > 50)

select name from passanger, booking, flight
where passanger.id = booking.id and booking.flight = flight.flight and flight.late > 50

这将导致姓名3次,b名称一次,但如果您只想在结果中获得a和b的一个实例,则可以使用select distinct name。< / p>

答案 2 :(得分:0)

 select ps.name from passanger ps left join booking bk on (ps.id = bk.id) left join flight fl on (fl.flight = bk.flight) where  late >50