有两个名为
的表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
答案 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
然后你会看到为什么两个布鲁斯威利斯出现,你会知道问题是什么。