代码之家  ›  专栏  ›  技术社区  ›  Codesleuth

“Select Top”、“Left Outer Join”、“Order By”提供额外的行

  •  4
  • Codesleuth  · 技术社区  · 15 年前

    我有以下内容 访问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
    

    里面有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条记录的预期结果集,显示了区域名称和 无效的 价值观。

    为什么通过 LEFT OUTER JOIN 威尔 TOP 条款不起作用?

    编辑:可能的解决方案

    当我也 按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 回复  |  直到 15 年前
        1
  •  2
  •   mmmmmm    15 年前

    您看到的行为不是因为字段是通过左外部联接检索的,而是因为字段为空

    SQL中的空值的行为与任何其他值都不同

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

    在这种情况下,如果要使用top,可以通过添加

    WHERE tblRegion.Region IS NOT NULL
    
        2
  •  2
  •   amelvin    15 年前

    我以前见过,因为如果order by中使用的第25列是唯一的,那么access只返回25行。如果它递归,那么access也会返回绑定值,这意味着它可以按一个顺序返回超过25行,而另一个顺序则正好返回25行。

    因此,如果order by的结尾为空,它将显示所有绑定(空)值。这种错误可能在较新版本的Access中修复,但ASI在此计算机上没有访问权限,但您可以尝试:

    选择Top5 1、2、3、4、5、5、5、5、5升序和降序,查看它是否适用于您的访问版本。

    高温高压

        3
  •  1
  •   CResults    15 年前

    我没有安装访问权限或您的架构,但这是否有效?

    SELECT  TOP 25 
            tblClient.ClientCode, 
            tblRegion.Region
    FROM    (tblClient LEFT OUTER JOIN
                tblRegion ON tblClient.RegionCode = tblRegion.RegionCode)
    ORDER BY NZ(tblRegion.Region,'')
    
        4
  •  0
  •   Codesleuth    15 年前

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

    因为我不介意按第二个字段排序,所以现在我会这样做。

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