由于某些部署限制,我无法在项目中使用synomyms,因此我创建了此视图:
CREATE VIEW [dbo].[User] AS SELECT * FROM [PersonalData].[dbo].[User]
GO
它工作正常,但现在我需要修改它如下:
ALTER VIEW [dbo].[User] AS
SELECT [Id],
t.[Name] AS [Title],
[FirstName],
[LastName],
[JobTitle],
[Department],
[EmailAddress],
[PhoneNumber],
[PhoneExtension],
[MobilePhoneNumber],
[CreatedDate],
[ModifiedDate],
[Uid],
[Active]
FROM [PersonalData].[dbo].[User] AS u
LEFT OUTER JOIN [PersonalData].[dbo].[Titles] AS t ON u.TitleId = t.Id
GO
目前,它失败了:
Ambiguous column name 'Id'
在LEFT OUTER JOIN
行。
但是,Microsoft SQL Management Studio突出显示[PersonalData].[dbo].[Titles]
并显示错误:
Invalid object name '[PersonalData].[dbo].[Titles]
事实上,它并没有为该表的列提供IntelliSense。
表[PersonalData].[dbo].[Titles]
就在那里。实际上,以下查询返回没有错误的结果:
select * from [PersonalData].[dbo].[Titles]
我对SQL的了解不够深入,但我不明白为什么会这样,为什么它找到Users
表却找不到Titles
。
更多背景信息:
PersonalData
数据库中,而是在名为Platform
的其他数据库中。Platform
数据库中创建视图。为什么会这样?
答案 0 :(得分:3)
您需要将表名添加到[id]
字段。因为该字段在两个表中都是为什么它被认为是不明确的(视图不知道从哪个表中获取它)。
SELECT u.[Id] AS [id]
答案 1 :(得分:3)
IntelliSense问题是外围设备,可能是因为:
Id
,因为它存在于两个表中)或Edit > IntelliSense > Refresh Local Cache
来解决此问题(并根据与服务器的网络连接) ,等待几秒甚至几分钟。)那就是说,我会建议两个改变,一个是严肃的,一个只是一个最佳实践:
Id
命名。这个名字完全没有意义。是UserID
吗?好的,无论它出现在架构中的哪个位置都称之为UserID
。答案 2 :(得分:1)
尝试
ALTER VIEW [dbo].[User] AS
SELECT u.[Id],
看来,您的用户表和标题标签页都有一个名为“Id”的列。它告诉你它不知道你在SELECT列列表中指的是哪个Id列。