【问题标题】:The multi part identifier ... could not be bound [37000] - SQL 2005 query多部分标识符 ... 无法绑定 [37000] - SQL 2005 查询
【发布时间】:2011-11-10 02:52:21
【问题描述】:

我知道这是一个很常见的问题,但在经历了本网站和其他地方列出的类似问题之后,我至今无法纠正它。

无论如何,我在一个论坛中有一个基于 PHP 的应用程序,它允许用户互相给予信誉点,我相信你们都知道这些简单的设置是如何工作的,所以我不会详述它。问题是,我相信这段代码最初是为 MySQL 编写的,虽然其中 95% 已经转换为 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)

当查询运行时,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 之前,则不再发生错误,并返回数据,但这并没有多大用处,因为它破坏了 Left Join 并从 users 表中拉入前 25 个,忽略他们在信誉表中是否有任何关联条目。

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

给定的代表点数(r.rep_point)

给积分的用户(r.rep_from, u.user_id, u.username)

给定日期点(r.rep_time)

用户输入的评论给出了代表点(r.rep_comment)

(r.rep_post_id, p.post_id, p.post_subject)提供代表的论坛帖子

如果有人对问题出在哪里或如何对其进行重组有任何想法,我将不胜感激。我意识到这可能是非常基本的东西,但我真的看不到这里的树木!

谢谢

【问题讨论】:

  • FROM forum_reputations r, forum_users u 会给你一个笛卡尔连接。
  • 感谢这个有用的指针,我目前正在更深入地研究笛卡尔连接情况,它似乎还有一些其他的代码我还没有得到,这个问题也只是在看它,你可能为我节省了一些未来的头疼! :)

标签: sql-server-2005 syntax identifier multipart


【解决方案1】:

试试

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_usersforum_reputation 之间的连接条件 - 这将产生笛卡尔积。我在上面添加了一个连接,但我猜测它是否在正确的列上。

【讨论】:

  • 这实际上是对的!据我所知,您设法使列名正确,它的返回数据,正确连接,现在没有错误。非常感谢你,真的很感激 :) 我将不得不重新审视我的联接,我没有意识到标准的平面联接可以在 LEFT 之外应用并且仍然可以这样计算。为帮助干杯:)
【解决方案2】:

您不能将隐式和显式连接结合起来并期望它能够正常工作。您必须明确所有在任何情况下都应该执行的连接,因为隐式连接是一种 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 的想法是正确的。

【讨论】:

  • 嗨,你说得非常正确,Ed 的查询有效,但在此期间我还没有看到你的帖子。不过,我将尝试使用 CROSS 连接查询您的查询,以更好地了解它们之间的内在差异,感谢您的输入并帮助我进一步完善对 JOINS 的理解。
猜你喜欢
  • 2012-02-16
  • 1970-01-01
  • 2013-01-17
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 2020-06-16
相关资源
最近更新 更多