2012-02-21 13 views
1

私は、データベース内の3台を持っています次のデータを得るselect文を書く:外部結合SQLテーブル? ACTIVITY_IDとの間のマッピングをACTIVITY_IDと</p> <ol> <li>アクティビティテーブル、CATEGORY_IDとACTIVITY_TYPE</li> <li>カテゴリーテーブル、カテゴリ名</li> <li>リンクテーブルと</li> </ol> <p>私は必要CATEGORY_ID -

activity_id, activity_type, Category_name. 

activity_idの一部がリンクテーブルにエントリを持たないという問題があります。

私が書く場合:

select a.activity_id, a.activity_type, c.category_name 
from activity a, category c, link l 
where a.activity_id = l.activity_id and c.category_id = l.category_id 

その後私は、リンクテーブルに存在しないactivity_idsのためのデータを得ることはありません。 category_idへのリンクがない場合は、空値またはnull値を持つすべてのアクティビティのデータをcategory_nameとして取得する必要があります。

私に助けてください。

PS。私はMS SQL Server DBを使用しています

+2

古いスタイルの暗黙の 'JOIN'を使用しないでください! **これまでに** – JNK

+0

他の解決策はありますか? –

+2

明示的な 'JOIN'構文を使用してください。 – JNK

答えて

2

私はあなたのアクティビティテーブルがすべての行を返すためにLEFT OUTER JOINを探していると思います。

SELECT 
a.activity_id, a.activity_type, c.category_name 
FROM activity a 
LEFT OUTER JOIN link l 
ON a.activity_id = l.activity_id 
LEFT OUTER JOIN category c 
ON c.category_id = l.category_id; 
2

あなたが適切な明示的な使用すべきでは加入:

select a.activity_id, a.activity_type, c.category_name 
from activity a 
LEFT JOIN link l 
ON a.activity_id = l.activity_id 
LEFT JOIN category c 
ON l.category_id = c.category_id 
0

何について?

select a.activity_id, a.activity_type, c.category_name from category c 
left join link l on c.category_id = l.category_id 
left join activity a on l.activity_id = a.activity_id 

最初の参加実は、このタイプのロジックを書くことは、あなたの現在進行中の一部になる場合があり

+0

同じ古い結果を返します。 –

1

いくつか欠けている要素があるかもしれないことを言及しなかったので、それは、inner joinことができているようですジョインとwhere句のやりとりなど、ジョインに関するいくつかの調査を行うことを強くお勧めします。ジョインとwhere句は、データを取得するために使用されたテクノロジにかかわらず、クエリ作成のバックボーンを形成するために結合します。

最も重要な、理解するための情報を参加:

  • 左外部結合:
  • 内部結合結合テーブルに存在する「左」テーブルからすべての情報およびすべてのレコードを取得するには:存在するレコードのみを取得します両方のテーブルで
  • where句:内部または外部の結合定義に関係なく、データを制限するために使用されます。

投稿した例では、where句は全体のデータを3つのテーブルすべてに存在する行に限定しています。 where句を適切な結合ロジックに置き換えると、このトリックが実行されます。

select a.activity_id, a.activity_type, c.category_name 
from activity a 
    left outer join link l --return all activity rows regardless of whether the link exists 
      on a.activity_id = l.activity_id 
left outer join category c --return all activity rows regardless of whether the link exists 
      on c.category_id = l.category_id 

最高の運があります!

関連する問題