Sql 相同的查询给出不同的结果
因此,对于学校的作业,我们必须从数据库中提取计数。问题如下: --19) 包含“Europe”的时区名称中有多少机场被用作具有“M”或“L”尾迹的飞机的航线的源机场(源机场id) 这是我想出的密码Sql 相同的查询给出不同的结果,sql,database,pgadmin,Sql,Database,Pgadmin,因此,对于学校的作业,我们必须从数据库中提取计数。问题如下: --19) 包含“Europe”的时区名称中有多少机场被用作具有“M”或“L”尾迹的飞机的航线的源机场(源机场id) 这是我想出的密码 SELECT count(DISTINCT airports.id) FROM airports WHERE timezone_name LIKE '%Europe%' AND id IN (SELECT source_airport_id FROM routes WHERE id IN (SELE
SELECT count(DISTINCT airports.id) FROM airports WHERE timezone_name LIKE '%Europe%' AND id IN
(SELECT source_airport_id FROM routes WHERE id IN
(SELECT id FROM route_aircrafts WHERE aircraft_id IN
(SELECT id FROM aircrafts WHERE wake_size IN ('M', 'L'))));
结果是544,而教授的答案是566
SELECT count (DISTINCT airports.id)
FROM airports, routes, route_aircrafts, aircrafts
WHERE airports.id = routes.source_airport_id
AND routes.id = route_aircrafts.route_id
AND aircrafts.id = route_aircrafts.aircraft_id
AND airports.timezone_name LIKE'%Europe%'
AND aircrafts.wake_size IN ('M', 'L'); --566
对我来说,这两个人应该做相同的事情,我不明白为什么答案不同。要在查询中得到相同的答案,您需要:
SELECT count(DISTINCT airports.id) FROM airports WHERE timezone_name LIKE '%Europe%' AND id IN
(SELECT source_airport_id FROM routes WHERE id IN
(SELECT route_id FROM route_aircrafts WHERE aircraft_id IN
(SELECT id FROM aircrafts WHERE wake_size IN ('M', 'L'))));
您使用的是主ID字段,而不是外键路由ID。您得到的结果大致相似,因为这些值中肯定存在明显的重叠。我将使用以下内容:
SELECT COUNT(DISTINCT airports.id)
FROM airports
INNER JOIN routes ON airports.id = routes.source_airport_id
INNER JOIN route_aircrafts ON routes.id = route_aircrafts.route_id
INNER JOIN aircrafts ON route_aircrafts.aircraft_id = aircrafts.id
AND aircrafts.wake_size IN ('M', 'L')
WHERE airports.timezone_name LIKE '%Europe%'
说明:
您不想多次计算重复的机场.id
s
FROM airports
这是你数数的主桌。所有其他表都是从这个表生成的
INNER JOIN routes ON airports.id = routes.source_airport_id
内部联接
将只包括两个表中匹配的行。匹配机场.id
和路线.source\u airport\u id
INNER JOIN route_aircrafts ON routes.id = route_aircrafts.route_id
INNER JOIN aircrafts ON route_aircrafts.aircraft_id = aircrafts.id
AND aircrafts.wake_size IN ('M', 'L')
内部联接
将只包括两个表中匹配的行。在routes.id
和route\u飞行器.route\u id
上匹配
INNER JOIN route_aircrafts ON routes.id = route_aircrafts.route_id
INNER JOIN aircrafts ON route_aircrafts.aircraft_id = aircrafts.id
AND aircrafts.wake_size IN ('M', 'L')
与上面的内部联接
s相同。我们为唤醒
添加了额外的过滤器。对于内部联接
,也可以在WHERE
子句中执行此筛选,而不更改结果。在JOIN
中放置过滤器可以将意图保持在一起(优化器可能会以这种方式进行过滤)。对于外部联接
,在联接
中进行过滤与在中进行过滤相比,其中
可能会返回不同的结果(取决于您的数据)
现在,我们从机场
的基表中按时区名称
过滤整个结果集
使用SQL时,将数据放在集合中考虑是很重要的。这将帮助您编写性能更好、编程更少的查询 仅供参考:如果您的讲师正在使用逗号语法进行连接,您可能应该找到一位具有较新经验的讲师。如果可以,请避免使用子选择进行筛选。改用
JOIN
s。子选择将破坏您的性能。