无法在 SQL Server 2008 上绑定多部分标识符
Posted
技术标签:
【中文标题】无法在 SQL Server 2008 上绑定多部分标识符【英文标题】:The multi-part identifier could not be bound on SQL Server 2008 【发布时间】:2010-11-07 23:35:03 【问题描述】:我有两张桌子
requests
(ID
, company_id
, amount
)
companies
(ID
, name
)
带有 FK 约束 (requests.company_id
-> companies.id
)
requests.company
可以是NULL
我需要获取所有请求并将company_id
替换为适当的公司name
,如果没有指定公司,则将其留空。
我有下一个问题:
SELECT R.[ID], C.[name] AS [company], R.[amount], ...
FROM [requests] AS R, [companies] AS C, ...
WHERE R.[company_id] = C.[ID]
在 company
字段中输入 NULL 之前它工作正常。
我试着做下一步:
SELECT R.[ID], C.[name] AS [company], ...
FROM [requests] AS R, ...
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID
得到了
无法绑定多部分标识符“R.company_id”
ON
子句转换中的字段也会出现相同的错误。我做错了什么?
【问题讨论】:
【参考方案1】:我想你想要:
SELECT R.[ID], ISNULL(C.[name], '') AS [company]
FROM [requests] AS R
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = C.ID
编辑:见 cmets,需要左连接 ...
在我看来也不需要左连接,所以你可以重写为:
SELECT R.[ID], C.[name] AS [company]
FROM [requests] AS R
JOIN [companies] AS C
ON R.[company_id] = C.ID
【讨论】:
他确实需要左连接。 Requests.Company_ID 可以为空。如果没有外部连接,Company_ID 为 null 的请求将从结果中删除。 @Shannon,你说得对,我错过了这个:如果没有指定公司,则将其留空。【参考方案2】:您展示的代码示例有省略号,我相信是省略号中的内容导致了问题。
你有:
SELECT R.[ID], C.[name] AS [company], ...
FROM [requests] AS R, ...
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID
假设是这样的:
SELECT R.[ID], C.[name] AS [company], X.Field
FROM [requests] AS R, [eXample] as X
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID
WHERE X.[request_id] = R.ID
换句话说,ANSI 92 之前的内连接语法与 ANSI 92 外连接语法的混合。在 SQL Server 2005 上进行测试时,在您的示例中,在将 R 与 ... 分隔开的逗号之后,似乎看不到请求的别名 R,而在我的示例中,[eXample] 为 X。然而,以下确实有效:
SELECT R.[ID], C.[name] AS [company], X.Field
FROM [eXample] as X, [requests] AS R
-- Requests and companies on the same side of the comma
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID
WHERE X.[request_id] = R.ID
或
SELECT R.[ID], C.[name] AS [company], X.Field
FROM [requests] AS R LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID, [eXample] as X
WHERE X.[request_id] = R.ID
-- Yuck, I would hate to find this. Not at all sure from reading
-- the code how it would work.
还是我最喜欢的,因为我喜欢 ANSI 92 连接语法:
SELECT R.[ID], C.[name] AS [company], X.Field
FROM [requests] AS R
INNER JOIN [eXample] as X ON X.[request_id] = R.ID
LEFT OUTER JOIN [companies] AS C ON R.[company_id] = S.ID
【讨论】:
表在哪里别名为“S”以便约束“= S.ID”有效? S.ID 在 OP 中,可能在椭圆中。 ???既然它帮助了 OP,我不想编辑,因为我担心我只会扼杀解释。处理丢失的代码很困难。【参考方案3】:用逗号更改表顺序使其在 sql server 2005,2008 和 2012 中工作
例如
假设您有如下查询,但在 sql 2005 及更高版本中将失败:
SELECT t1.*,t2.*, t3.*
FROM table1 AS t1, table2 as t2
LEFT OUTER JOIN table3 AS t3
ON t1.id = t3.id
WHERE t1.id = t2.id
如果您重写查询并在连接前以逗号更改表的顺序,则该查询将在 sql 2005 及更高版本中工作。例如
SELECT t1.*,t2.*, t3.*
FROM table2 as t2, table1 as t1
LEFT OUTER JOIN table3 AS t3
ON t1.id = t3.id
WHERE t1.id = t2.id
【讨论】:
以上是关于无法在 SQL Server 2008 上绑定多部分标识符的主要内容,如果未能解决你的问题,请参考以下文章