我好像有一个泡菜,一桌三列,忘了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
答案 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 |
+-----------+