“SELECT TOP”,“LEFT OUTER JOIN”,“ORDER BY”给出了额外的行

时间:2010-03-09 09:37:29

标签: sql ms-access select left-join sql-order-by

我有以下 Access 2002 查询我在.NET中运行OLE DB:

SELECT  TOP 25 
        tblClient.ClientCode, 
        tblRegion.Region
FROM    (tblClient LEFT OUTER JOIN
            tblRegion ON tblClient.RegionCode = tblRegion.RegionCode)
ORDER BY tblRegion.Region

tblClient中有431条记录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 个答案:

答案 0 :(得分:2)

您看到的行为不是因为该字段是通过LEFT OUTER JOIN检索的,因为该字段为NULL

SQL中的NULL与任何其他值

的行为不同

如果a和b都为NULL,则a = b为假。因此,当比较分组访问时,将所有NULL视为不同的值

在这种情况下,如果您想使用TOP,可以通过添加

来排除NULL值
WHERE tblRegion.Region IS NOT NULL

答案 1 :(得分:2)

我以前见过这个,然后是因为如果ORDER BY中使用的第25列是唯一的,则Access只返回25行。如果它再次出现Access也返回了绑定值,这意味着它可以在一个ORDER BY中返回超过25行,在另一个ORDER BY中返回25个。

因此,如果ORDER BY的结尾命中NULL,它将显示所有绑定(NULL)值。这种错误可能在较新版本的Access中得到修复,但因为我在这台机器上没有Access,但您可以尝试:

选择前5个{1,2,3,4,5,5,5,5}升序和降序以查看它是否适用于您的Access版本。

HTH

答案 2 :(得分:1)

我没有安装Access或您的架构,但这有用吗?

SELECT  TOP 25 
        tblClient.ClientCode, 
        tblRegion.Region
FROM    (tblClient LEFT OUTER JOIN
            tblRegion ON tblClient.RegionCode = tblRegion.RegionCode)
ORDER BY NZ(tblRegion.Region,'')

答案 3 :(得分:0)

当我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

因为如果我按第二个字段排序,我真的不介意,现在我会这样做。

我已按问题更新,以反映这是一个可能的解决方案。