2012-03-07 25 views
0

私は3つのテーブル、クライアント、ツールとClientToolsを持っています。 1つのクライアントは複数のツールを持つことができるため、ClientToolsはピボットテーブルとして機能します(IDのみを含む)。私がやりたい何3テーブルの外部結合

は、特定のクライアントのために、ツールの完全なリストを持っている、で、フラグはクライアントがこのツールを持っているか否かを示します。私はこれまで来た

は次のとおりです。

select  t.Id as [ToolId], 
      t.Name as [ToolName], 
      Cast(case when c.Id is NULL then 0 else 1 end as bit) as [HasThisTool], 
from  Tool t 
Left join ClientTools ct 
on   t.Id = ct.ToolId 
Left Join Client c 
on   ct.ClientId = c.Id 

正しく私にすべてのツールを提供しますが、すべてのクライアントのために(複数のクライアントが、このツールを所有する際にツールの行を複製する)どの。

しかし、すぐに、私はどこに近い選択したクライアントにフィルタリングするために使用して、私のクエリはこのクライアントの行を返します(その左はもう行われていない参加)。

where c.Id = 123where (c.Id = 123 or c.Id is null)を追加しようとしましたが、機能しませんでした。

私には何が欠けていますか?

ありがとうございます!クエリで

+0

WHERE句を投稿できますか? –

+0

完了。 (ああ、最小文字数の制限を歓迎します!) – Shimrod

答えて

1

試してみてください:

select  t.Id as [ToolId], 
      t.Name as [ToolName], 
      Cast(case when ct.Id is NULL then 0 else 1 end as bit) as [HasThisTool] 
from  Tool t 
Left join ClientTools ct 
on   t.Id = ct.ToolId and ct.ClientId = @ClientId 
+0

ありがとうございました!私はjoin節で 'and'を使わなければならないのか分かりませんでした。 – Shimrod

1

、あなたのクライアントの名前を取得していない場合、あなたはそのテーブルに参加する必要はありません(ただし、そのない本当の問題)。

select  t.Id as [ToolId], 
      t.Name as [ToolName], 
      Cast(case when ct.Id is NULL then 0 else 1 end as bit) as [HasThisTool] 
from  Tool t 
Left join (SELECT * FROM ClientTools WHERE ClientId = @ClientId) ct 
on   t.Id = ct.ToolId 
+0

これは実際のケースからの単純化されたサンプルです。私はこの句を追加しようとしましたが、結果はClientIdが指定された行だけを取得していて、他のものはNULLとして表示されません。 – Shimrod

+0

@Shimrod - 私の答えを修正しました、今すぐ試してください – Lamak

+0

ラマック、ありがとう私はマークのソリューションを好むが、私はそれがあなたのものよりも怒っている(犯罪ではない)ことを発見する。ここにあなたのためのupvoteがあります! – Shimrod

0

あなたがあなたのテーブルの順序を切り替えた場合、それが動作するはずです:このお試しください。本質的に

select  t.Id as [ToolId], 
      t.Name as [ToolName], 
      Cast(case when t.Id is NULL then 0 else 1 end as bit) as [HasThisTool], 
from  Client c 
Left join ClientTools ct 
on   c.Id = ct.ClientId 
Left Join Tool t 
on   ct.ToolId = t.Id 
where  c.id = 123 

を、あなたは(そのクライアントを言っていますツールではない)は、行が結果セットに表示されるかどうかを決定するものです。

+0

私は反対にしたい、それぞれのツール(毎回)を表示し、クライアントがこのツールを持っている場合は、行に彼を表示します。しかし、あなたの答えに感謝します。 – Shimrod

関連する問題