2009-07-03 17 views
5

にバインドすることができませんでした私は(FK制約で2つのテーブルマルチパート識別子は、SQL Server 2008の

requestsIDcompany_idamount

companiesIDname

を持っていますrequests.company_id - >​​)

requests.companyは、NULL

私はすべてのリクエストを受け取り、を適切な会社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節のフィールド。私は間違って何をしていますか?

答えて

9

あなたが示したコード例では、楕円を持っていたし、私はそれがトラブルを引き起こしている楕円であるものであると信じています。あなたが持っている

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を...と区切っているコンマを過ぎて見えません。私は、ANSI 92結合構文を好きなので

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. 

や私の好きな、::以下は、しかし仕事をした、カンマでテーブルの順序を変更する

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 
+2

制約 "= S.ID"が機能するように、テーブルは "S"としてエイリアスされていますか? –

+1

S.IDがOPにありました。おそらく、省略記号内のものです。 ???それはOPを助けて以来、私は編集したくない、私はちょうど説明を食べるだろうと思うので、私はしたくない。ミッシングコードを扱うのは難しかったです。 –

3

私は、あなたがしたいと思う:

SELECT R.[ID], ISNULL(C.[name], '') AS [company] 
FROM [requests] AS R 
    LEFT OUTER JOIN [companies] AS C 
ON R.[company_id] = C.ID 

EDIT:コメントを参照してください、左が参加...

を必要とされていることも左結合のための必要はありませんように私には見える、そうすることができます再書き込みとして:

SELECT R.[ID], C.[name] AS [company] 
FROM [requests] AS R 
    JOIN [companies] AS C 
ON R.[company_id] = C.ID 
+0

左結合が必要です。 Requests.Company_IDはnullでもかまいません。外部結合がなければ、Company_IDがnullの要求は結果から除外されます。 –

+0

@Shannon、あなたはそうだ、私はこれを逃した:または会社が指定されていない場合は空白のままにした。 –

1

はそれがで動作しますSQL Server 2005,2008および2012

たとえば

は、あなたがどの以下のようなクエリがSQL Server 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 Server 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 
関連する問題