2017-07-20 20 views
1

JOINを使用する方法と私の人生のために勉強しようとしています。私が望む結果を得るためにクエリを頭に浮かべているようです。JOINを使用する3つのテーブルのSQL Serverクエリ

マイテーブル:

These are my tables:

私は何を達成しようとしていることである:

ゴールドとしてタグ付けされている資料からのすべての記事を選択し、銀は

は、私は私のテーブルのリレーションシップがあると信じてOK、GreenはPKとRed FKです。

私はこれで、複数の試みを行っている、これは私の最新のものです:

SELECT Articles.Article_Name, Articles_Tagged.Tag_ID, Tags.Tag_Name 
FROM Articles 
INNER JOIN Articles_Tagged ON Articles.Article_ID=Articles_Tagged.Article_ID 
WHERE Articles_Tagged.Tag_Name='Gold' AND Articles_Tagged.Tag_Name='Silver'; 

私は私の問題は、私はこのメッセージを投げていると思われて、JOINであると考えている:

The multi-part identifier "Tags.Tag_Name" could not be bound. 
+3

このテーブルの列を使用するには、「タグ」テーブルに参加する必要があります。 – Rokuto

+2

テーブルに参加するためにもう1つの内部結合を追加するタグ、 'INNER JOINタグON Tags.Tag_ID = Articles_Tagged.Tag_ID' – ProgrammingBaKa

+2

は本当にうまく結合を説明しますhttps://stackoverflow.com/questions/406294/left-join-vs-left- outer-join-in-sql-server – dbajtr

答えて

3

joinは、あなたが参加する各テーブル(もちろんfrom句を含む)から構成された行を作成します。いずれの行もに「」の「Gold」と「Silver」の両方が含まれていないため、クエリは決して行を返しません。この問題にアプローチする

1つの方法は、2つ持つものを「ゴールド」と「シルバー」が記事にタグをどのように多くの異なるカウントし、返すことです:

SELECT * 
FROM articles a 
WHERE EXISTS (SELECT at.article_id 
       FROM  articles_tagged at 
       JOIN  tags t ON at.tag_id = t.tag_id 
       WHERE at.article_id = a.article_id AND 
         tag_name IN ('Gold', 'Silver') 
       GROUP BY at.article_id 
       HAVING COUNT(DISTINCT tag_name) = 2) 
+0

こんにちは、あなたの答えをありがとう。私は今これを試しています。私はあなたに完全に従うかどうかわからない。 Articles_Taggedテーブルを見ると、Article ID = 1にGold、Silver、Bronzeというタグが付いていることがわかります。これは行が金と銀の両方をそこに持つことができるという意味ではないでしょうか? – deucalion0

+0

私はあなたの答えから欲しかった結果を得ています。大変感謝してくれてありがとう! – deucalion0

-1
SELECT Articles.Article_Name, Articles_Tagged.Tag_ID, Tags.Tag_Name 
FROM Articles 
INNER JOIN Articles_Tagged ON 
    Articles.Article_ID = Articles_Tagged.Article_ID 
INNER JOIN Tags ON Articles_Tagged.Tag_ID = Tags.Tag_ID 
WHERE Articles_Tagged.Tag_Name = 'Gold' 
OR Articles_Tagged.Tag_Name = 'Silver'; 

あなたはタグテーブルに参加するのを忘れていました。条件は、金と銀の両方としてタグ付けされた記事のためのものでした。の代わりにまたはを使用してください。

-2

これはどのようにすべきである SELECT Articles.Article_Name, Articles_Tagged.Tag_ID, Tags.Tag_Name FROM Articles INNER JOIN Articles_Tagged ON Articles.Article_ID=Articles_Tagged.Article_ID INNER JOIN TAGS ON TAGS.TAGID=Articles_Tagged.TAG_ID WHERE TAGS.Tag_Name='Gold' AND TAGS.Tag_Name='Silver';

1

金と銀のタグを持つ商品IDの交差点を取得できます。その後、これらの記事IDプールからすべての記事を取得します。私はそれを試すことができませんでした。いくつかの構文エラーがあります。しかし、それは主なアイデアを提供します。

SELECT * FROM Articles WHERE Article_ID IN 
    ((SELECT Articles_Tagged.Article_ID 
     FROM Articles_Tagged 
     WHERE Articles_Tagged.Article_Tagged_ID = 1) 
    INTERSECT 
    (SELECT Articles_Tagged.Article_ID 
     FROM Articles_Tagged 
     WHERE Articles_Tagged.Article_Tagged_ID = 2 
    ) 
) 
関連する問題