我有以下 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
因为如果我按第二个字段排序,我真的不介意,现在我会这样做。
答案 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
因为如果我按第二个字段排序,我真的不介意,现在我会这样做。
我已按问题更新,以反映这是一个可能的解决方案。