我在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 join本身运行正常(当作为普通查询运行时。问题似乎是当Row_Number() over (Order By COLUMN)
与COLUMN
表中的FROM
不同时使用(Order By [tbl1].[col1] ASC)
。查询。
如果我将第3行更改为{{1}},那么它会毫无问题地运行。仅当排序列位于不同的DB中时才会发生错误。
有谁知道为什么会这样?有关如何解决此问题的任何建议吗?
答案 0 :(得分: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;
所以我怀疑还有其他问题(例如col2
确实不存在)。另外我注意到你正在调用tb2
和tbl2
这个东西 - 你可能在另一个数据库中同时拥有tb2
和tbl2
,并且你正在引用它错了吗?
编辑我创建了这个:
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
的上下文中运行您的查询。它运行正常。所以最后一次我会建议你没有告诉我们关于模式的事情,或者你对这些名称进行模糊处理的事实(并且已经不得不纠正这样做的一个错误)已经模糊了太多的东西甚至为你......