【问题标题】:sql server join query issuesql server join 查询问题
【发布时间】:2011-03-09 15:26:06
【问题描述】:

我正在使用此查询进行分页

 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 

【问题讨论】:

  • {0} .. {4} 的值是多少?无论如何,您都应该使用参数化查询而不是字符串连接。
  • @syrion:如果您有数百万行,您想将所有这些都拉回客户端然后分页......
  • @syrion - 我完全不同意这一点。除了带回比您需要的更多的数据,您将如何使数组与数据库保持同步?
  • 一句话:PARAMETRIZED QUERIES! - 像这样将你的命令连接在一起是一项非常危险的 任务 - SQL 注入攻击指日可待。 ....
  • @marc_s:是的。我是在一个网站的背景下思考的,在这个网站上,您最多有 200 条左右的记录。但是... @martin:无论如何,您不能在每个查询上都与数据库同步;如果您在页面之间切换时结果发生变化,那么您很可能会错过前几页的更改或在分页时跳过数据(因为它已按查询顺序移动)。

标签: .net sql sql-server ado.net mssqlft


【解决方案1】:

这可能是括号问题,您必须在 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} 

【讨论】:

  • 据我所知,{1} 似乎是一个排序方向。我不确定添加的括号会有所帮助(或伤害)。不过,关于确保列得到前缀/限定,你是绝对正确的。马上。
  • 你是对的,括号在 SQL Server 中可能没有好坏之分。我对 Access 感到困惑的是,如果省略支架可能会造成很大的损害。
【解决方案2】:

c.Make 被多次指定,“AS Rows”已被移除且是必需的。

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 

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多