首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么(以及如何)对FROM表的“隐式”引用会在此查询中导致返回假结果?

为什么(以及如何)对FROM表的“隐式”引用会在此查询中导致返回假结果?
EN

Stack Overflow用户
提问于 2019-05-22 22:46:23
回答 1查看 24关注 0票数 0

我的查询的目的是通过RegistrationNumber在两个表之间链接DateTimeIn和DateTimeOut条目。(数据来自一项停车位利用率调查...)

我先尝试了连接,但它不能处理复杂性。例如,一辆车可能有一个DateTimeOut (它离开了停车区),但没有DateTimeIn (它从来没有停车,可能是因为所有的停车位都被占用了)。此外,我还必须确保第一个DateTimeIn链接到最早的DateTimeOut,并且每个DateTime只链接一次。

下面的“嵌套查询”似乎完成了工作,但它返回了假阳性结果。我不知道这些是怎么产生的。即使没有RegistrationNumber的DateTimeOut,也会返回一个。奇怪的是,在显式地引用了这些表之后,这些误报就被消除了。

代码语言:javascript
复制
-- Implicit reference to the second table (causes false positives):

SELECT
    RegistrationNumber,
    DateTimeIn,
    (SELECT MIN(O.DateTimeOut) FROM HobieBeachVehiclesOut O WHERE O.RegistrationNumber = RegistrationNumber AND O.DateTimeOut > DateTimeIn) AS DateTimeOut
FROM HobieBeachVehiclesIn
ORDER BY DateTimeIn, RegistrationNumber

-- Explicit references all round (no glaring errors):

SELECT
    RegistrationNumber,
    DateTimeIn,
    (SELECT MIN(O.DateTimeOut) FROM HobieBeachVehiclesOut O WHERE O.RegistrationNumber = A.RegistrationNumber AND O.DateTimeOut > A.DateTimeIn) AS DateTimeOut
FROM HobieBeachVehiclesIn A
ORDER BY DateTimeIn, RegistrationNumber

结果:

代码语言:javascript
复制
-- Implicit reference to the second table (causes false positives):

JHB 036 03/05/2019 00:09:00 03/05/2019 06:08:00
FNB 559 03/05/2019 06:00:00 03/05/2019 06:08:00
HGB 115 03/05/2019 06:05:00 03/05/2019 06:08:00

-- Explicit references all round (no glaring errors):

JHB 036 03/05/2019 00:09:00 NULL
FNB 559 03/05/2019 06:00:00 03/05/2019 06:48:00
HGB 115 03/05/2019 06:05:00 03/05/2019 07:53:00

错误是显而易见的,现在,再看一眼,就更奇怪了。这个DateTimeOut从何而来?为什么查询不能处理对dbo.HobieBeachVehiclesIn的“隐式引用”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 01:34:02

在查询中,如果没有为列指定别名,则假定使用别名。假定别名是包含您正在使用的列的任何表。这可以很好地工作,并且只有在查询中有多个表具有相同的列时才会出现错误……在这一点上你需要别名。

因此,在第一个没有RegistrationNumber别名的查询中,假设RegistrationNumber列来自查询中唯一的表...化名为"O“的那个。这与在子查询中编写“WHERE RegistrationNumber = RegistrationNumber”相同。

要编写相关子查询(这就是您所拥有的...引用自身外部列的子查询),则必须包括外部查询的别名。正如我所说的,如果没有给出别名,SQL将假定别名,但它只假定同一查询中的一个表。它不会在外部查找假定的表别名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56259481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档