«Выберите верх», «левый внешний соединение», «Порядок» дает дополнительные ряды

StackOverflow https://stackoverflow.com/questions/2407947

Вопрос

У меня есть следующее Доступ 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,'')
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top