SQL匹配联系ID与许多标签ID

时间:2017-05-23 15:21:41

标签: sql sql-server where

我好像有一个泡菜,一桌三列,忘了Id栏。我向tagId添加了contactId,因此一个contactId可以有多个TagId's

我需要选择与我的IN contactId's匹配的TagId's,例如

- 表格 - Id ContactId TagId 3136 2562 4 3137 2585 4 3139 2772 4 4543 2117 150 4882 2562 150 4903 2585 150 5067 2772 150 5229 2804 150 5241 2808 150 5244 2809 150 5247 2810 150 5250 2811 150 5457 2085 4

- SQL MSSQL 2005 -

SELECT [Id],[ContactId],[TagId]
FROM [search-contacts].[dbo].[ContactTagsGrouping]
WHERE ContactId IN (2085,2804,2808,2809,2810,2117,2811,2772,2562,2585) 
  AND TagId IN (150,4)

在此先感谢,这只是一小部分数据,我有几百行,TagId IN()可以选择多个TagId's

在上面的SQL中,我应该只看到三个匹配150和4的ContactId个记录,例如

的ContactID 2772 2562 2585

1 个答案:

答案 0 :(得分:1)

使用聚合将给定的ContactId与一组TagId匹配:

SELECT [ContactId]
  FROM [search-contacts].[dbo].[ContactTagsGrouping]
  WHERE ContactId IN (2085,2804,2808,2809,2810,2117,2811,2772,2562,2585) 
    AND TagId IN (150,4)
group by ContactId
having count(distinct TagId)=2 /* 2 is the number of tags in the TagId in() */

如果ContactId, TagId上有唯一的索引/约束,那么您可以跳过distinct中的count(distinct TagId)以消除排序运算符产生的任何开销。

rextester演示:http://rextester.com/RUF13404

返回:

+-----------+
| ContactId |
+-----------+
|      2562 |
|      2585 |
|      2772 |
+-----------+