内部联接在 sql 服务器中给出行号不想要的结果
Inner join gives undesired result with row number in sql server
我尝试使用 ROW_NUMBER()
对数据进行分页
这是我的查询:
SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS Row,* FROM SpecificOrders)
AS EMP
inner join Users as c on EMP.UserID = c.UserID
inner join Users as u on EMP.CreatedBy = u.UserID
inner join SpecificOrderPayment as p on EMP.OrderID= p.OrderID
WHERE Row BETWEEN 0 AND 10
当我执行这个查询时,我得到如下输出:
Row | OrderID | UserID |
1 | | |
5 | | |
6 | | |
7 | | |
8 | | |
9 | | |
10 | | |
如果我删除这个 WHERE Row BETWEEN 0 AND 10
条件,那么它会给我所有记录
我的问题是为什么我只得到 7 行,为什么行列中缺少 2,3 和 4。
此外,如果我删除第 3 个连接查询 (SpecificOrderPayment
),那么它会给我正确的结果。
您的 OrderID 在 SpecificOrders 中为 null 或空白,并且它们正在排序到顶部 - 否则该方法并没有错,尽管还有其他方法可以做到这一点,例如 TOP 10..etc
SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS Row,* FROM SpecificOrders
WHERE RTRIM(COALESCE(OrderID, '')) <> '')
AS EMP
inner join Users as c on EMP.UserID = c.UserID
inner join Users as u on EMP.CreatedBy = u.UserID
inner join SpecificOrderPayment as p on EMP.OrderID= p.OrderID
WHERE Row BETWEEN 0 AND 10
问题是您对 SpecificOrders
而非最终结果的行进行编号。
在您的情况下,每个订单只有一行,因此使用左联接应该可以解决问题
但是,如果内部查询可以 return 每个 OrderID
多行,您将多次看到相同的行号
如果连接(内部)将过滤某些行,您将不会在结果中获得该行号。
您只需将数据提取查询与分页查询分开,
试试这个:
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY EMP.OrderID) AS Row, EMP.*
FROM SpecificOrders AS EMP
left join Users as c on EMP.UserID = c.UserID
left join Users as u on EMP.CreatedBy = u.UserID
left join SpecificOrderPayment as p on EMP.OrderID= p.OrderID
) D
WHERE [Row] BETWEEN 0 AND 10
我尝试使用 ROW_NUMBER()
对数据进行分页
这是我的查询:
SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS Row,* FROM SpecificOrders)
AS EMP
inner join Users as c on EMP.UserID = c.UserID
inner join Users as u on EMP.CreatedBy = u.UserID
inner join SpecificOrderPayment as p on EMP.OrderID= p.OrderID
WHERE Row BETWEEN 0 AND 10
当我执行这个查询时,我得到如下输出:
Row | OrderID | UserID |
1 | | |
5 | | |
6 | | |
7 | | |
8 | | |
9 | | |
10 | | |
如果我删除这个 WHERE Row BETWEEN 0 AND 10
条件,那么它会给我所有记录
我的问题是为什么我只得到 7 行,为什么行列中缺少 2,3 和 4。
此外,如果我删除第 3 个连接查询 (SpecificOrderPayment
),那么它会给我正确的结果。
您的 OrderID 在 SpecificOrders 中为 null 或空白,并且它们正在排序到顶部 - 否则该方法并没有错,尽管还有其他方法可以做到这一点,例如 TOP 10..etc
SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS Row,* FROM SpecificOrders
WHERE RTRIM(COALESCE(OrderID, '')) <> '')
AS EMP
inner join Users as c on EMP.UserID = c.UserID
inner join Users as u on EMP.CreatedBy = u.UserID
inner join SpecificOrderPayment as p on EMP.OrderID= p.OrderID
WHERE Row BETWEEN 0 AND 10
问题是您对 SpecificOrders
而非最终结果的行进行编号。
在您的情况下,每个订单只有一行,因此使用左联接应该可以解决问题
但是,如果内部查询可以 return 每个 OrderID
多行,您将多次看到相同的行号
如果连接(内部)将过滤某些行,您将不会在结果中获得该行号。
您只需将数据提取查询与分页查询分开,
试试这个:
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY EMP.OrderID) AS Row, EMP.*
FROM SpecificOrders AS EMP
left join Users as c on EMP.UserID = c.UserID
left join Users as u on EMP.CreatedBy = u.UserID
left join SpecificOrderPayment as p on EMP.OrderID= p.OrderID
) D
WHERE [Row] BETWEEN 0 AND 10