看起来很简单,但我很难过!

时间:2009-09-01 00:46:54

标签: sql sql-server sql-server-2005 tsql

这应该是这么简单,但我画了一个空白。我有两张桌子。

Table:article_tag_pvt
colum: article_id
column: tag_id

Table: tag
column: tag_id
column: name

article_tag_pvt表是一个多对多数据透视表。

问题是,我需要一个给出标签名称列表的查询,它将检索只与这些标签名称匹配的文章ID。这些表的基本连接如下所示:

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN tag t ON t.tag_id = pvt.tag_id

我已经有了一个查询,它将检索与指定的任何标记名称匹配的文章ID。这看起来像这样:

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN tag t ON t.tag_id = pvt.tag_id
WHERE t.name IN ('events','news')

我试过这些但没有快乐:

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN tag t ON t.tag_id = pvt.tag_id
WHERE t.name = 'events' AND t.name = 'news'

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN (
SELECT tag_id
FROM tag
WHERE name IN ('events','news')
) AS t
ON t.tag_id = pvt.tag_id

非常感谢任何帮助

戴夫

2 个答案:

答案 0 :(得分:3)

问题是你得到的所有行都有事件或新闻。如果您在多对多表中从未有过多于一个事件或新闻,您可以使用GROUP BY和HAVING来解决它

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN tag t ON t.tag_id = pvt.tag_id
WHERE t.name = 'events' OR t.name = 'news' 
GROUP BY article_id HAVING count(*) = 2

答案 1 :(得分:2)

我的偏好是:

SELECT pvt.article_id
  FROM article_tag_pvt pvt
  JOIN tag t ON t.tag_id = pvt.tag_id AND t.name = 'events'
  JOIN tag t2 ON t2.tag_id = pvt.tag_id AND t2.name = 'news'

使用GROUP BY / HAVING的替代方案:

  SELECT pvt.article_id
    FROM article_tag_pvt pvt
    JOIN tag t ON t.tag_id = pvt.tag_id
   WHERE t.name IN ('events', 'news')
GROUP BY pvt.article_id, t.name
  HAVING COUNT(DISTINCT t.name) = 2

COUNT(DISTINCT t.name)需要等于为t.name IN子句定义的选项数。