我的查询的目的是通过RegistrationNumber在两个表之间链接DateTimeIn和DateTimeOut条目。(数据来自一项停车位利用率调查...)
我先尝试了连接,但它不能处理复杂性。例如,一辆车可能有一个DateTimeOut (它离开了停车区),但没有DateTimeIn (它从来没有停车,可能是因为所有的停车位都被占用了)。此外,我还必须确保第一个DateTimeIn链接到最早的DateTimeOut,并且每个DateTime只链接一次。
下面的“嵌套查询”似乎完成了工作,但它返回了假阳性结果。我不知道这些是怎么产生的。即使没有RegistrationNumber的DateTimeOut,也会返回一个。奇怪的是,在显式地引用了这些表之后,这些误报就被消除了。
-- 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
结果:
-- 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的“隐式引用”?
发布于 2019-05-23 01:34:02
在查询中,如果没有为列指定别名,则假定使用别名。假定别名是包含您正在使用的列的任何表。这可以很好地工作,并且只有在查询中有多个表具有相同的列时才会出现错误……在这一点上你需要别名。
因此,在第一个没有RegistrationNumber别名的查询中,假设RegistrationNumber列来自查询中唯一的表...化名为"O“的那个。这与在子查询中编写“WHERE RegistrationNumber = RegistrationNumber”相同。
要编写相关子查询(这就是您所拥有的...引用自身外部列的子查询),则必须包括外部查询的别名。正如我所说的,如果没有给出别名,SQL将假定别名,但它只假定同一查询中的一个表。它不会在外部查找假定的表别名。
https://stackoverflow.com/questions/56259481
复制相似问题