【发布时间】: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