SQL查询无效

时间:2017-01-20 17:27:50

标签: sql

有两个名为

的表
Passenger (ID_psg, name)
Pass_in_trip (trip_no, date, ID_psg, place)

可能有几名乘客拥有相同的名字和姓氏(例如,布鲁斯威利斯)。我的目标是找到不同乘客的名字,这些乘客不止一次地占用了相同数量的座位。它是sql-ex.ru

给出的练习63

我的查询首次尝试是

SELECT p.name
FROM pass_in_trip  pt LEFT JOIN passenger p
    ON pt.id_psg = p.id_psg
GROUP BY pt.id_psg, pt.place,p.name
HAVING COUNT(*) > 1

我无法找出它没有返回所需结果的原因。我知道可以使用子查询完成,但我想知道我哪里出错了。地点栏代表座位号。您可以将sql-server作为数据库。 期望的结果应该看起来像这样

  name
--------
Bruce Willis        
Nikole Kidman       
Mullah Omar  

1 个答案:

答案 0 :(得分:1)

这会让你不止一次在pass_in_trip表中的人

SELECT p.name
FROM pass_in_trip  pt 
INNER JOIN passenger p
    ON pt.id_psg = p.id_psg
GROUP BY p.name
HAVING COUNT(*) > 1

这将使您拥有同名的人多次拥有相同的座位。请注意,这将包括具有不同ID的两个具有相同名称的人。

SELECT p.name
FROM pass_in_trip  pt 
INNER JOIN passenger p
    ON pt.id_psg = p.id_psg
GROUP BY pt.place,p.name
HAVING COUNT(*) > 1

这将让你拥有不同id_psgs且具有相同席位的人(因此两个不同的人名为Bruce Willis,他们每次使用相同的座位多次出现在结果中,你会看到Brice Willis两次)。 / p>

SELECT p.name
FROM pass_in_trip  pt 
INNER JOIN passenger p
    ON pt.id_psg = p.id_psg
GROUP BY pt.id_psg,pt.place,p.name
HAVING COUNT(*) > 1

现在,当尝试调试这种性质的代码时,最好在查询的选择部分显示组中的所有项目,即使您打算稍后删除它们也是如此。如果你这样做了:

SELECT pt.id_psg,pt.place,p.name
FROM pass_in_trip  pt 
INNER JOIN passenger p
    ON pt.id_psg = p.id_psg
GROUP BY pt.id_psg,pt.place,p.name
HAVING COUNT(*) > 1

然后你会看到为什么两个布鲁斯威利斯出现,你会知道问题是什么。