【问题标题】:Using Row_Number() Over (Order By Column) When Column is in Different DB Returns Error当列在不同的数据库中时使用 Row_Number() Over (Order By Column) 返回错误
【发布时间】:2012-06-06 00:34:24
【问题描述】:

我在 Sql Server (2008) 中提交以下查询

WITH query AS (SELECT TOP 100 PERCENT
    ROW_NUMBER() OVER
    (ORDER BY [tbl2].[col2] ASC) AS TableRowNumber ,
    [tbl1].[col1] ,
    [tbl2].[col2]
FROM [db1].[dbo].[tbl1] AS [tbl1]
JOIN [db2].[dbo].[tbl2] AS [tbl2]
    ON [tbl1].[id] = [tbl2].[id])

SELECT
    *
FROM query
WHERE TableRowNumber BETWEEN 1 AND 15
ORDER BY TableRowNumber ASC

运行此查询时,它会返回以下错误消息:

Msg 207, Level 16, State 1, Line 3
Invalid column name 'col2'. 

sql 连接本身运行良好(当作为普通查询运行时。问题似乎出在 COLUMN 与查询的 FROM 表位于不同的数据库中时使用 Row_Number() over (Order By COLUMN)

如果我将第 3 行更改为 (Order By [tbl1].[col1] ASC),那么它运行时不会出现任何问题。仅当排序列位于不同的数据库中时才会发生该错误。

有人知道为什么会这样吗?有关如何解决此问题的任何建议?

【问题讨论】:

  • 我似乎无法重复这一点
  • 我看到了同样的事情。 Yaakov,当您完全省略 ROW_NUMBER() 部分时会发生什么? (我敢打赌,您在第 4 行或第 5 行仍然会得到一个无效的列)。 TOP 100 PERCENT 的目的到底是什么?
  • 也许我没有明白这一点,但是有什么特殊原因你不能在 FROM-JOIN 子句中简单地将 tbl1 与 tb2 切换?
  • 我知道您已经说过联接有效,但您确定 [db2].[dbo].[tb2] 不应该是 [db2].[dbo].[tbl2]
  • 如果我的 Order By 子句中的列名不存在于表中,我可以重现这种情况的绝对唯一方法

标签: sql-server sql-server-2008 tsql row-number


【解决方案1】:

这对我来说没问题:

SELECT a.name, b.object_id, rn = ROW_NUMBER() OVER (ORDER BY b.object_id DESC)
  FROM sys.columns AS a 
  INNER JOIN tempdb.sys.objects AS b
  ON a.object_id = b.object_id;

所以我怀疑还有其他问题正在发生(例如col2 真的不存在)。我还注意到您正在调用 tb2tbl2 - 您是否有可能在另一个数据库中同时拥有 tb2tbl2,而您引用了错误的?

编辑我创建了这个:

CREATE DATABASE db1;
GO
USE db1;
GO
CREATE TABLE dbo.tbl1(ID INT, col1 INT);
GO
INSERT dbo.tbl1 SELECT 1, 5
UNION ALL SELECT 2, 10;
GO
CREATE DATABASE db2;
GO
USE db2;
GO
CREATE TABLE dbo.tbl2(ID INT, col2 INT);
GO
INSERT dbo.tbl2 SELECT 1, 9
UNION ALL SELECT 2, 4;
GO
USE db1;
GO

然后在db1 的上下文中运行您的查询。它运行良好。所以最后一次我会建议你没有告诉我们关于模式的一些事情,或者你已经混淆了名称(并且已经不得不纠正一个错字)这一事实已经混淆了太多东西即使是你...

【讨论】:

  • 没有。我只是写了假表名。只是一个错字(我会修复它)。 col2 确实存在。如果我只是运行选择查询而忽略了 row_number() 部分,或者即使我只是对 db1.tbl1 中的列进行排序,它也可以正常工作。
  • @YaakovEllis 你为什么会这样认为(或者假设我发布的示例是我唯一尝试过的示例)?它的语法 - SQL Server 解析器不会给出您引用的数据库的废话。如果我将ORDER BY b.object_id DESC 更改为ORDER BY b.floob,我确实会收到与您完全相同的错误消息...所以我再次建议您仔细检查您的对象,并告诉我们当您从查询中删除ROW_NUMBER() 计算时会发生什么完全,请。
  • 我发布了该示例,因为您可以自己测试它以表明 ROW_NUMBER() 在提取源自不同数据库的列或表达式时没有问题。我可以使用我这里有的两个数据库,但你没有那些数据库,是吗?
  • @YaakovEllis 我发布了一个更新的示例,该示例创建了您在查询中引用的两个表,并且我可以再次执行您的查询而不会出错。所以有别的事情发生了。如果您不想告诉我们所有细节,那很好,但如果您的混淆掩盖了真正的问题,我们将无法猜测问题。
  • “也许你混淆了名字的事实甚至对你来说也混淆了太多东西”......是的。 实际查询在Row_Number() Order By 部分中具有 tbl1 别名,正如您所预测的那样,这是错误 的原因。感谢您的帮助和来之不易的指责。
猜你喜欢
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
相关资源
最近更新 更多