使用Row_Number()Over(按列排序)当列在不同的DB中时返回错误

Yaa*_*lis 0 t-sql sql-server row-number sql-server-2008

我在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
Run Code Online (Sandbox Code Playgroud)

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

Msg 207, Level 16, State 1, Line 3
Invalid column name 'col2'. 
Run Code Online (Sandbox Code Playgroud)

sql连接本身运行正常(当作为普通查询运行时.问题似乎是使用Row_Number() over (Order By COLUMN)when COLUMNFROM与查询表不同的数据库中.

如果我将第3行更改为读取,(Order By [tbl1].[col1] ASC)那么它运行没有任何问题.仅当排序列位于不同的DB中时才会发生此错误.

有谁知道为什么会这样?对于如何解决这个问题,有任何的建议吗?

Aar*_*and 8

这对我有用没问题:

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;
Run Code Online (Sandbox Code Playgroud)

所以我怀疑还有其他问题(例如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
Run Code Online (Sandbox Code Playgroud)

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

  • "也许是你对这些名字进行了模糊处理的事实,甚至对你来说已经过多了一些东西"......是的.<hanging-head-in-shame>实际查询在`Row_Number()Order By`部分中有tbl1别名,正如您预测的那样,这是错误的原因</ hanging-head-in-shame>.感谢您的帮助和来之不易的谴责. (4认同)
  • 我发布了这个例子,因为你可以自己测试一下,以显示ROW_NUMBER()在拉动源自不同数据库的列或表达式时没有问题.我可以使用我在这里的两个数据库,但你没有这些数据库,对吗? (3认同)
  • @YaakovEllis我发布了一个更新的示例,它创建了您在查询中引用的两个表,并且我可以再次执行您的查询而不会出错.还有别的东西了.如果您不想告诉我们所有细节,那很好,但如果您的混淆掩盖了真正的问题,我们将无法猜测问题. (2认同)