2011-03-09 120 views
1

我使用这个查询分页SQL Server的连接查询问题

SELECT * 
FROM 
    (SELECT ROW_NUMBER() OVER (ORDER BY {0} {1}) AS RowNum, * 
    FROM Cars 
    WHERE IdOwner = {2}) AS Rows 
WHERE RowNum > {3} AND RowNum < {4} 

我想使分页查询2个表,而不是只有一个,因为我现在要做的。

SELECT * 
FROM 
    (SELECT ROW_NUMBER() OVER (ORDER BY {0} {1}) AS RowNum, 
      Cars.Id, Cars.Make, Cars.Model, Color.Name 
    FROM Cars 
    INNER JOIN Color ON Cars.ColorId = Color.Id 
    WHERE IdOwner = {2}) AS Rows 
WHERE RowNum > {3} AND RowNum < {4} 

我得到一个Incorrect syntax near the keyword 'WHERE'.

问题解决了。谢谢你们,我这种小白:(

SELECT * 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY c.Id ) AS RowNum, 
     c.Id, c.Make, c.Model, d.ColorName 
     FROM Car AS c 
     INNER JOIN Color AS d 
     ON c.ColorId = d.Id WHERE c.IdOwner=1) AS Rows 
WHERE RowNum > 0 AND RowNum < 11 
+1

什么的'{0}''.. {4}'?你应该使用参数化的值无论如何不是字符串串联 – 2011-03-09 15:29:15

+0

好吧, s没有直接解决你的问题,但你通常应该在你的程序中分页,而不是在数据库中分页。将相关信息加载到数组中,然后进行分页。 – syrion 2011-03-09 15:30:58

+3

@syrion:如果你有数百万行,你**不会**想把所有的东西都拉回到客户端,然后分页...... – 2011-03-09 15:31:48

回答

1

c.Make多次指定和 “为行” 已被删除,是必要的。

SELECT * 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY c.Id ) AS RowNum, 
     c.Id, c.Make, c.Model, d.ColorName 
     FROM Car AS c 
     INNER JOIN Color AS d 
     ON c.ColorId = d.Id WHERE c.IdOwner=1) AS Rows 
WHERE RowNum > 0 AND RowNum < 11 
4

这可能是一个问题的支架,你必须前缀您IdOwner小心你的前缀{0}和{1}参数:

SELECT ROW_NUMBER() OVER (ORDER BY {0} {1}) AS RowNum, 
     Cars.Id,Cars.Make, Cars.Model, Color.Name 
FROM (Cars INNER JOIN Color ON Cars.ColorId=Color.Id) 
WHERE Cars.IdOwner={2} 
+0

从我所知道的看来,{1}看起来就像是一个排序方向。我不确定添加的括号会对帮助(或伤害)产生什么影响。不过,您绝对正确地确保列的前缀/限定。正确的。 – Enull 2011-03-09 16:31:55

+0

那么你是对的,括号可能不会在SQL Server中变得好或错。我与Access混淆的是,如果支架可以省略,它可以造成很大的伤害。 – 2011-03-09 16:37:15