Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 相同的查询给出不同的结果_Sql_Database_Pgadmin - Fatal编程技术网

Sql 相同的查询给出不同的结果

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

因此,对于学校的作业,我们必须从数据库中提取计数。问题如下:

--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 
(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。子选择将破坏您的性能。