【问题标题】:SQL Server query on three tables using JOIN使用 JOIN 对三个表进行 SQL Server 查询
【发布时间】:2017-07-20 08:06:57
【问题描述】:

我正在尝试学习如何使用 JOIN,但在我的一生中,我似乎无法理解我需要得到我想要的结果的查询。

我的表:

我想要实现的是:

从标记为 Gold 和 Silver 的文章中选择所有文章

我相信我的桌子关系没问题,绿色是 PK 和红色 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.

【问题讨论】:

  • 您需要加入表Tags 才能使用该表中的列。
  • 再添加一个内连接来加入你的表标签,INNER JOIN Tags ON Tags.Tag_ID=Articles_Tagged.Tag_ID
  • 很好地解释了连接stackoverflow.com/questions/406294/…

标签: sql sql-server select join


【解决方案1】:

join 将构造由您加入的每个表组成的行(当然包括from 子句中的表)。由于没有任何一行包含同时“Gold”和“Silver”,因此您的查询将永远不会返回任何行。

解决这个问题的一种方法是计算一篇文章有​​多少个不同的“Gold”和“Silver”标签,并返回有两个标签的:

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)

【讨论】:

  • 您好,谢谢您的回答。我现在正在尝试这个。我不确定我是否完全跟随你。如果查看 Articles_Tagged 表,您可以看到 Article ID =1 被标记为 Gold、Silver 和 Bronze。这不是意味着一行可以同时包含 Gold 和 Silver 吗?
  • 我从您的回答中得到了我想要的结果,非常感谢您的帮助!
【解决方案2】:

您可以获得带有金银标签的文章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
   )
  )

【讨论】:

    【解决方案3】:
    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 而不是 And

    【讨论】:

      【解决方案4】:

      应该是这样的 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';

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多