Почему (и как) «неявные» ссылки на таблицу FROM вызывают возврат ложных результатов в этом запросе? - PullRequest
0 голосов
/ 22 мая 2019

Цель моего запроса - связать записи DateTimeIn и DateTimeOut между двумя таблицами посредством RegistrationNumber. (Данные из обследования использования парковки ...)

Сначала я попробовал соединение, но оно не справилось со сложностью. Например, у транспортного средства может быть DateTimeOut (он вышел из зоны парковки), но нет DateTimeIn (он никогда не парковался, возможно, потому, что все отсеки были заняты). Кроме того, я должен убедиться, что первый DateTimeIn связан с самым ранним DateTimeOut и что каждый DateTime связан только один раз.

Следующий «вложенный запрос», казалось, выполнил задание, но он дал ложноположительные результаты. Я понятия не имею, как они возникли. Даже если не было DateTimeOut для RegistrationNumber, он был возвращен. Как ни странно, после того, как все ссылки на таблицы были явными, эти ложные срабатывания были устранены.

-- 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?

1 Ответ

0 голосов
/ 22 мая 2019

в запросе, если вы не указали псевдоним вашего столбца, псевдоним предполагается.Предполагаемый псевдоним - это любая таблица, в которой есть используемый вами столбец.Это работает нормально, и вы получите сообщение об ошибке только в том случае, если в вашем запросе более одной таблицы с одним и тем же столбцом ... в этот момент вам нужно указать псевдоним.

Так что в вашем первом запросе с RegistrationNumber нетпсевдоним, предполагается, что столбец RegistrationNumber взят из единственной таблицы в запросе ... с псевдонимом "O".Это то же самое, что написать «WHERE RegistrationNumber = RegistrationNumber» в вашем подзапросе.

Чтобы написать коррелированный подзапрос (который у вас есть ... подзапрос, который ссылается на столбец вне себя), вы ДОЛЖНЫвключите псевдоним внешнего запроса.SQL, как я уже говорил, будет принимать псевдоним, если псевдоним не задан, но он будет принимать таблицу только в том же запросе.Он не будет искать снаружи предполагаемый псевдоним таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...