SQL查询-奇怪的行为
为什么@OrdersTempWithPaging返回错误的行数?我如何避免它 更新: 下面的语句返回25=5*5行,而不是5行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
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*的结果?