2011-11-09 10 views
0

これは非常に一般的なものですが、これに記載されている同様の問題を経て、これまで修正できませんでしたサイトや他の場所。マルチパートの識別子...バインドできませんでした[37000] - SQL 2005のクエリ

とにかく、フォーラムで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の予約語のように遠隔から聞こえるオブジェクトを囲むことさえしようとしました。 ]、r。[ユーザ名]など)でも違いはありません。興味深いことに、FROM句を変更してForum_usersがForum_users rの前にある場合、エラーは発生せず、データが返されますが、これは左結合を破棄してusersテーブルから上位25を引き出すため、評判テーブルに関連するエントリがあるかどうかを無視します。

出力は、リスト、ユーザのために、各担当者のエントリ(r.rep_to)は、次の表で構成すると考えられる:点を与え(r.rep_point)

ユーザ所定の担当者点の

(r.rep_from, u.user_id, u.username)

日のポイントは、担当者ポイント(r.rep_comment)

を与え、ユーザーが入力した (r.rep_time)

コメントを与えられました

フォーラムは、担当者は誰もが、これは間違って起こっているか、それを再構築することができますどのようにどこにどんな考えを持っている場合は、私は非常にそれを聞い感謝(r.rep_post_id, p.post_id, p.post_subject)

のために与えられたことを投稿してください。私はこれがおそらく非常に初歩的なものだと気づいていますが、私は本当にここの木の木が見えません!あなたが参加する暗黙的および明示的に結合し、それが正しく動作することを期待することはできません

おかげ

+0

FROM forum_reputations r、forum_users uはデカルト結合を行います。 –

+0

この有益なポインタのおかげで、現在カートリスの参加状況を深く掘り下げていますが、私がまだ持っていない他のコードが現れています。この問題も見ています。ヘッドスクラッチ! :) –

答えて

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間の結合条件は、クエリから欠落している - これはデカルト積を生成します。私は上記の参加を追加しましたが、それが正しい列にあるかどうかについて少し推測しています。

+0

それは実際にお金の上に正しいです!そして、私が見る限り、正しい列名を得て、返されたデータは正しく結合され、現在はエラーフリーです。本当にありがとう、本当にありがとう:)私は私の結合にブラッシュアップする必要があります、私は標準フラットジョインがLEFTの外に適用することができ、それのように数えられることを認識していませんでした。ヘルプのための乾杯:) –

0

。暗黙的な結合は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が正しいアイデアを持っていると思う。

+0

こんにちは、あなたはかなり正しいです。エドのクエリは機能しましたが、その間あなたの投稿は見られませんでした。私はCROSSを使ってあなたの質問を試してみましょう。あなたの意見に感謝し、JOINSの理解を深める助けになります。 –

関連する問題