Sql server 2005 多部分标识符。。。无法绑定[37000]-SQL 2005查询

Sql server 2005 多部分标识符。。。无法绑定[37000]-SQL 2005查询,sql-server-2005,syntax,identifier,multipart,Sql Server 2005,Syntax,Identifier,Multipart,我意识到这是一个相当常见的问题,但在经历了本网站和其他网站列出的类似问题后,我至今无法纠正它 无论如何,我在一个论坛上有一个基于PHP的应用程序,它允许用户互相给对方打分,我相信你们都知道这些简单的设置是如何工作的,所以我不会详细讨论它。问题是,我相信这段代码最初是为MySQL编写的,虽然95%的代码已经转换为MS SQL,现在可以在MS SQL中使用,但在SQL 2005中仍然有一些查询看起来很糟糕,我怀疑这是由于连接等中的轻微语法不一致造成的。这段代码让我陷入了困境。 示例查询如下所示: S

我意识到这是一个相当常见的问题,但在经历了本网站和其他网站列出的类似问题后,我至今无法纠正它

无论如何,我在一个论坛上有一个基于PHP的应用程序,它允许用户互相给对方打分,我相信你们都知道这些简单的设置是如何工作的,所以我不会详细讨论它。问题是,我相信这段代码最初是为MySQL编写的,虽然95%的代码已经转换为MS SQL,现在可以在MS SQL中使用,但在SQL 2005中仍然有一些查询看起来很糟糕,我怀疑这是由于连接等中的轻微语法不一致造成的。这段代码让我陷入了困境。 示例查询如下所示:

SELECT TOP 25 p.post_id, p.post_subject, p.forum_id, u.username, u.user_id, 
 u.user_colour, r.rep_id, r.rep_from, r.rep_to, r.rep_time, r.rep_post_id, 
 r.rep_point, r.rep_comment, r.enable_urls, r.rep_ip_address, r.username 
FROM forum_reputations r, forum_users u 
LEFT JOIN forum_posts p ON (r.rep_post_id = p.post_id) 
WHERE r.rep_to = 61
ORDER BY r.rep_id DESC
**Forum_Posts**:
post_id (int, PK)
post_subject (varchar)
forum_id (int)

**Forum_users**:
username (varchar)
user_id (int, PK)
user_colour (varchar)

**Forum_reputations**:
rep_id (int, PK)
rep_from (int) 
rep_to (int)
rep_time (int)
rep_post_id (int)
rep_point (int)
rep_comment (text)
enable_urls (int) 
rep_ip_address (varchar) 
username (varchar)
数据如下:

SELECT TOP 25 p.post_id, p.post_subject, p.forum_id, u.username, u.user_id, 
 u.user_colour, r.rep_id, r.rep_from, r.rep_to, r.rep_time, r.rep_post_id, 
 r.rep_point, r.rep_comment, r.enable_urls, r.rep_ip_address, r.username 
FROM forum_reputations r, forum_users u 
LEFT JOIN forum_posts p ON (r.rep_post_id = p.post_id) 
WHERE r.rep_to = 61
ORDER BY r.rep_id DESC
**Forum_Posts**:
post_id (int, PK)
post_subject (varchar)
forum_id (int)

**Forum_users**:
username (varchar)
user_id (int, PK)
user_colour (varchar)

**Forum_reputations**:
rep_id (int, PK)
rep_from (int) 
rep_to (int)
rep_time (int)
rep_post_id (int)
rep_point (int)
rep_comment (text)
enable_urls (int) 
rep_ip_address (varchar) 
username (varchar)
查询运行时,SQL Server会抛出以下常见错误:

[Microsoft][ODBC SQL Server Driver][SQL Server]The multi-part identifier "r.rep_post_id" could not be bound. [37000]
我很难理解为什么会这样。这显然暗示rep_post_id有问题,但我检查了查询语法和列/表名称,它们都是正确的,我甚至尝试将听起来像SQL保留字的任何对象括在方括号中(即u.[username]、r.[username]等),但这没有什么区别。有趣的是,如果我更改FROM子句,使Forum_users u在Forum_users r之前,则不再发生错误,并返回数据,但这没有多大用处,因为它会破坏左连接并从users表中拉入前25名,而忽略他们在声誉表中是否有任何关联的条目

输出应该包括一个表,其中列出了用户(r.rep_to)的每个rep条目的以下内容:

给定的代表点数
(r.rep\u点数)

评分的用户
(r.rep\u from,u.User\u id,u.username)

给出了日期点
(r.rep\u时间)

给予代表分数的用户输入的评论
(r.rep\u Comment)

代表为
发布的论坛帖子(r.rep\u post\u id,p.post\u id,p.post\u主题)

如果有人有任何想法,这是哪里出了问题,或者它可以如何重组,我非常感谢听到它。我意识到这可能是一种非常基本的东西,但我真的看不见这里的树木


谢谢

您不能将隐式联接和显式联接结合起来,并期望它能正常工作。由于隐式连接是SQL反模式,因此必须使所有连接都显式化,在任何情况下都应该这样做

这是您所拥有内容的解释版本:

SELECT TOP 25 p.post_id, p.post_subject, p.forum_id, u.username, u.user_id,
u.user_colour, r.rep_id, r.rep_from, r.rep_to, r.rep_time, r.rep_post_id,  
r.rep_point, r.rep_comment, r.enable_urls, r.rep_ip_address, r.username  
FROM forum_reputations r
CROSS JOIN forum_users u  
LEFT JOIN forum_posts p ON r.rep_post_id = p.post_id  
WHERE r.rep_to = 61 
ORDER BY r.rep_id DESC 
然而,我怀疑这不是你想要的。我认为@EdHarper的想法是正确的。

试试看

SELECT TOP 25 p.post_id, p.post_subject, p.forum_id, u.username, u.user_id, 
 u.user_colour, r.rep_id, r.rep_from, r.rep_to, r.rep_time, r.rep_post_id, 
 r.rep_point, r.rep_comment, r.enable_urls, r.rep_ip_address, r.username 
FROM forum_reputations r
JOIN forum_users u 
ON u.user_id = r.rep_from
LEFT JOIN forum_posts p ON r.rep_post_id = p.post_id 
WHERE r.rep_to = 61
ORDER BY r.rep_id DESC

这与您的问题没有直接关系,但是您的查询中缺少
forum\u用户
forum\u声誉
之间的连接条件-这将生成笛卡尔产品。我在上面添加了一个连接,但我猜测它是否在右边的列中。

来自forum\u声誉r,forum\u用户u
将为您提供笛卡尔连接。感谢这个有用的指针,我目前正在更深入地查看笛卡尔连接情况,似乎还有一些其他代码我还没有看到,这个问题也存在吗?只要看看它,你可能会让我在以后的日子里省去一些头疼的事!:)事实上,这是正确的钱!就我所见,您成功地获得了正确的列名,返回的数据正确地联接,现在没有错误。非常感谢,真的很感激:)我必须复习一下我的连接,我没有意识到标准的平面连接可以应用于左侧之外,并且仍然可以这样计算。为帮助干杯:)嗨,你说得很对,Ed的问题很有效,但我还没有看到你的帖子。不过,为了更好地理解它们之间的内在差异,我也将尝试使用交叉联接进行查询,感谢您的输入并帮助我进一步完善对联接的理解。