【问题标题】:Why does this "paging" query throw a "does not match with a table name or alias" error?为什么这个“分页”查询会抛出“与表名或别名不匹配”错误?
【发布时间】:2011-11-06 12:29:54
【问题描述】:

警告,“丑陋”的查询警报(MS SQL Server 2008):

SELECT BaseDocs.* FROM (
  SELECT ROW_NUMBER() OVER (ORDER BY BaseDocs.DateUpdated DESC) AS Row, BaseDocs.* 
    FROM BaseDocs INNER JOIN DocCats ON BaseDocs.DocId = DocCats.DocId  
    WHERE DocCats.CatId IN (4) AND BaseDocs.BaseId = 1
  ) AS Paged 
  WHERE Row > 0 AND Row <=3

这个查询抛出这个错误:

列前缀“BaseDocs”与表名或别名不匹配 查询中使用的名称。

此查询针对这些表:

BaseDocs Table
 - DocId PK
 - BaseId FK
 - ...

DocCategories Table
 - CatId PK
 - ...

DocCats (join) Table
 - DocId FK PK 
 - CatId FK PK

在这个查询“hack”了这么久之后,我觉得我的大脑正在煎炸......但它很接近,我能感觉到。提前致谢!

【问题讨论】:

  • 啊,太好了……呃,对不起……写问题时分心了。 ;) 正在编辑...

标签: sql sql-server-2008 pagination


【解决方案1】:

只是不要在您的 SELECT 中指定表别名 - 该表别名仅在您的子查询内部可见!

SELECT *
FROM 
   (SELECT 
        ROW_NUMBER() OVER (ORDER BY BaseDocs.DateUpdated DESC) AS Row, 
        BaseDocs.* 
    FROM BaseDocs 
    INNER JOIN DocCats ON BaseDocs.DocId = DocCats.DocId  
    WHERE 
         DocCats.CatId IN (4) 
         AND BaseDocs.BaseId = 1
  ) AS Paged 
WHERE 
   Row > 0 AND Row <= 3

或者:使用给你的子查询的别名:

SELECT Paged.* .....

【讨论】:

  • 天啊,这么小的变化...感谢您的帮助,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多