«Выберите верх», «левый внешний соединение», «Порядок» дает дополнительные ряды
-
18-09-2019 - |
Вопрос
У меня есть следующее Доступ 2002 Запрос, я бегаю через OLE DB в .NET:
SELECT TOP 25
tblClient.ClientCode,
tblRegion.Region
FROM (tblClient LEFT OUTER JOIN
tblRegion ON tblClient.RegionCode = tblRegion.RegionCode)
ORDER BY tblRegion.Region
Внутри 431 записи tblClient
который имеет RegionCode
установлен в NULL
.
По какой -то причине приведенный выше запрос возвращает все эти 431 записи вместо первых 25.
Если я изменю запрос на ORDER BY tblClient.Client
(имя клиента)
SELECT TOP 25
tblClient.ClientCode,
tblRegion.Region
FROM (tblClient LEFT OUTER JOIN
tblRegion ON tblClient.RegionCode = tblRegion.RegionCode)
ORDER BY tblClient.Client
Я получаю ожидаемый набор результатов из 25 записей, показывающий смесь названий региона и NULL
ценности.
Почему это упорядочение по полю, полученное через LEFT OUTER JOIN
будет ли TOP
пункт не работает?
РЕДАКТИРОВАТЬ: возможное решение
Когда я тоже ORDER BY tblClient.Client
Запрос, кажется, работает:
SELECT TOP 25
tblClient.ClientCode,
tblRegion.Region
FROM (tblClient LEFT OUTER JOIN
tblRegion ON tblClient.RegionCode = tblRegion.RegionCode)
ORDER BY tblRegion.Region, tblClient.Client
Так как я не против, если я сорван на втором поле, сейчас я сделаю это.
Решение 4
Когда я тоже ORDER BY tblClient.Client
Запрос, кажется, работает:
SELECT TOP 25
tblClient.ClientCode,
tblRegion.Region
FROM (tblClient LEFT OUTER JOIN
tblRegion ON tblClient.RegionCode = tblRegion.RegionCode)
ORDER BY tblRegion.Region, tblClient.Client
Так как я не против, если я сорван на втором поле, сейчас я сделаю это.
Я обновил вопрос, чтобы отразить это как возможное решение.
Другие советы
Поведение, которое вы видите, не связано с тем, что поле получено через левое внешнее соединение, потому что поле NULL
NULL в SQL не ведет себя как какое -либо другое значение
Если A и B оба являются нулевыми, то A = B является ложным. Таким образом, при сравнении для группировки доступа рассматривает все нули как разные значения
В этом случае, если вы хотите использовать Top, вы можете исключить нулевые значения, добавив
WHERE tblRegion.Region IS NOT NULL
Я видел это раньше, а затем был потому, что доступ возвращал только 25 строк, если 25 -й столбец, используемый в порядке, был уникальным. Если он повторил доступ, также вернул связанные значения, что означает, что он может вернуть более 25 строк в одном порядке и точно 25 в другом.
Так что, если конец порядка попадает в NULL, он покажет все связанные (нулевые) значения. Этот вид ошибки, вероятно, фиксируется в новых версиях доступа, но у ASI нет доступа на этой машине, но вы можете попробовать:
Выберите Top 5 {1,2,3,4,5,5,5,5} asconding and nackinding, чтобы увидеть, применимо ли это к вашей версии доступа.
Hth
У меня нет установленного доступа или вашей схемы в этом отношении, но это работает?
SELECT TOP 25
tblClient.ClientCode,
tblRegion.Region
FROM (tblClient LEFT OUTER JOIN
tblRegion ON tblClient.RegionCode = tblRegion.RegionCode)
ORDER BY NZ(tblRegion.Region,'')