内部联接在 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