使用JOIN

时间:2017-07-20 08:06:58

标签: sql sql-server select join

我正在尝试学习如何使用JOIN,而对于我的生活,我似乎无法理解我需要获得我想要的结果的查询。

我的表格:

These are my tables:

我想要实现的目标是:

从标记为黄金和白银的文章中选择所有文章

我相信我的桌子关系没问题,Green是PK&Red FK&#39>。

我已经做了多次尝试,这是我最新的:

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.

4 个答案:

答案 0 :(得分:3)

join将构造由您加入的每个表组成的行(当然包括from子句中的行)。因为没有一行会 " Gold"和"银"在其中,您的查询将永远不会返回任何行。

解决这个问题的一种方法是计算有多少不同的" Gold"和"银"标记文章,并返回两个:

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)

答案 1 :(得分: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
   )
  )

答案 2 :(得分:-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';

您忘了加入Tags表,条件是标记为Gold和Silver的文章,使用 OR 而不是

答案 3 :(得分:-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';