SQL查询-奇怪的行为

SQL查询-奇怪的行为,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,为什么@OrdersTempWithPaging返回错误的行数?我如何避免它 更新: 下面的语句返回25=5*5行,而不是5行 DECLARE @OrdersTemp TABLE ( OrderId UNIQUEIDENTIFIER ) INSERT INTO @OrdersTemp SELECT ord.Id FROM Orders --all rows count SELECT @RowsCount = COUNT(DISTINCT ord.Id) FROM

为什么@OrdersTempWithPaging返回错误的行数?我如何避免它

更新: 下面的语句返回25=5*5行,而不是5行

DECLARE @OrdersTemp TABLE
(
   OrderId UNIQUEIDENTIFIER
)

INSERT INTO @OrdersTemp
  SELECT ord.Id
  FROM Orders 

--all rows count
SELECT  
    @RowsCount = COUNT(DISTINCT ord.Id)
FROM   Orders 


--@RowsCount = 5. It's right!

--second table with paging
DECLARE @OrdersTempWithPaging TABLE
(
    OrderId UNIQUEIDENTIFIER
)

INSERT INTO @OrdersTempWithPaging
   SELECT OrderId
   FROM  (SELECT DISTINCT OrderId,
                 ROW_NUMBER() OVER (ORDER BY OrderId) AS RowNum
          FROM @OrdersTemp) AS alias
          WHERE 
              RowNum BETWEEN (@PageIndex - 1) * @PageSize + 1
                     AND @PageIndex * @PageSize

SELECT * FROM @OrdersTempWithPaging
--10 or more rows. It's wrong.

这是因为您在select中订购

   INSERT  INTO @OrdersTempWithPaging
                SELECT    OrderId
                FROM    (
                          SELECT    OrderId,
                                    ROW_NUMBER() OVER (ORDER BY OrderId ) AS RowNum
                          FROM      @OrdersTemp ) AS alias
                --WHERE   RowNum BETWEEN ( @PageIndex - 1 ) * @PageSize + 1
                             --  AND     @PageIndex * @PageSize
  SELECT * FROM @OrdersTempWithPaging
您必须在不必在选择中使用DISTINCT的列上进行排序

 SELECT    DISTINCT OrderId,
           ROW_NUMBER() OVER (ORDER BY OrderId ) AS RowNumber

试试看,不要有明显的

这是因为您在select

   INSERT  INTO @OrdersTempWithPaging
                SELECT    OrderId
                FROM    (
                          SELECT    OrderId,
                                    ROW_NUMBER() OVER (ORDER BY OrderId ) AS RowNum
                          FROM      @OrdersTemp ) AS alias
                --WHERE   RowNum BETWEEN ( @PageIndex - 1 ) * @PageSize + 1
                             --  AND     @PageIndex * @PageSize
  SELECT * FROM @OrdersTempWithPaging
您必须在不必在选择中使用DISTINCT的列上进行排序

 SELECT    DISTINCT OrderId,
           ROW_NUMBER() OVER (ORDER BY OrderId ) AS RowNumber
尝试它,不使用DISTINCT

尝试此方法,以反转DISTINCT用法:

如果您只需要不同的订单ID,您可以:

INSERT INTO @OrdersTempWithPaging
   SELECT DISTINCT OrderId
   FROM  (SELECT OrderId,
                 ROW_NUMBER() OVER (ORDER BY OrderId) AS RowNum
          FROM @OrdersTemp) AS alias
   WHERE 
       RowNum BETWEEN (@PageIndex - 1) * @PageSize + 1
              AND @PageIndex * @PageSize
然后:

INSERT INTO @OrdersTemp
  SELECT DISTINCT ord.Id
  FROM Orders 
尝试以下方法,以实现不同的用途:

如果您只需要不同的订单ID,您可以:

INSERT INTO @OrdersTempWithPaging
   SELECT DISTINCT OrderId
   FROM  (SELECT OrderId,
                 ROW_NUMBER() OVER (ORDER BY OrderId) AS RowNum
          FROM @OrdersTemp) AS alias
   WHERE 
       RowNum BETWEEN (@PageIndex - 1) * @PageSize + 1
              AND @PageIndex * @PageSize
然后:

INSERT INTO @OrdersTemp
  SELECT DISTINCT ord.Id
  FROM Orders 
而不是

INSERT INTO @OrdersTempWithPaging
   SELECT OrderId
   FROM  (SELECT OrderId,
                 ROW_NUMBER() OVER (ORDER BY OrderId) AS RowNum
          FROM @OrdersTemp) AS alias
   WHERE 
       RowNum BETWEEN (@PageIndex - 1) * @PageSize + 1
              AND @PageIndex * @PageSize
使用

这是SELECT DISTINCT和SELECT GROUP BY之间的一个有趣的例子,当SELECT列表包含一个排名函数时,它就会表现出来

在第一个查询中,输出包含来自@OrdersTemp的重复OrderId值,因为在应用DISTINCT之前会对排名函数进行求值。相反,第二个查询首先按OrderId对行进行分组,即首先有效地选择不同的OrderId值,然后应用排序。

而不是

INSERT INTO @OrdersTempWithPaging
   SELECT OrderId
   FROM  (SELECT OrderId,
                 ROW_NUMBER() OVER (ORDER BY OrderId) AS RowNum
          FROM @OrdersTemp) AS alias
   WHERE 
       RowNum BETWEEN (@PageIndex - 1) * @PageSize + 1
              AND @PageIndex * @PageSize
使用

这是SELECT DISTINCT和SELECT GROUP BY之间的一个有趣的例子,当SELECT列表包含一个排名函数时,它就会表现出来


在第一个查询中,输出包含来自@OrdersTemp的重复OrderId值,因为在应用DISTINCT之前会对排名函数进行求值。相反,第二个查询首先按OrderId对行进行分组,即首先有效地选择不同的OrderId值,然后应用排序。

如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮{},以很好地格式化和语法突出显示它!如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮{},以很好地格式化和语法突出显示它!1-也不能正常工作。它返回2行而不是5行。2窗口函数只能出现在SELECT或ORDER BY子句中。如果存在WHERE条件,我认为返回的第2行比原来的第5行少是正常的。您到底想实现什么以及应该返回什么?我想从@OrdersTempWithPaging获得分页结果。@亚历克斯:为什么您首先要将INSERT插入@OrdersTemp SELECT Orders.Id,而不是插入@OrdersTemp SELECT DISTINCT Orders.Id?1-也不能正常工作。它返回2行而不是5行。2窗口函数只能出现在SELECT或ORDER BY子句中。如果存在WHERE条件,我认为返回的第2行比原来的第5行少是正常的。您到底想实现什么以及应该返回什么?我想从@OrdersTempWithPaging获得分页结果。@亚历克斯:为什么您首先要从Orders中插入@OrdersTemp SELECT order.Id,而不是从Orders中插入@OrdersTemp SELECT DISTINCT order.Id?从@OrdersTemp中选择COUNT*的结果是什么?结果是什么从@OrdersTemp中选择COUNT*的结果?