选择与其他表重叠的人

时间:2012-10-31 09:45:19

标签: sql sql-server tsql

我甚至不知道如何提出一个好的头衔,所以我希望我能以正确的方式描述我的问题:)

所以我有一个人员表,它通过表PersonKeywords与关键字有N:N的关系。

然后我也有一个搜索表,它通过表格SearchKeywords与关键字有N:N的关系。

现在,此人可以与关键字A和B建立关系,搜索记录可以与关键字A和C建立关系。

现在我想要结果集中的人,因为搜索记录中至少有一个(在此'A'中)关键字。

我也想要那个拥有'A'的人,一个'C'的人,一个'A'和'C'的人,而不是那个只有B的人。

所以这是两个列表上的匹配,但我不知道从哪里开始创建这样的声明......

2 个答案:

答案 0 :(得分:1)

所以你有三个人......

declare @persons table (id int identity(1,1), name varchar(10))
insert @persons (name) values ('Babs'),('Ken'),('Neville'),('Sue')

Babs有A和B,Ken有A和C,Neville只有B而Sue只有C

declare @personkeywords table (personid int, keyword varchar(5))
insert @personkeywords values (1,'a'),(1,'b'),(2,'a'),(2,'c'),(3,'b'),(4,'c')

搜索A或C

declare @searchkeywords table (searchid int, keyword varchar(5))
insert @searchkeywords values (1,'a'),(1,'c')

因此...

select distinct persons.*
from @persons persons
     inner join @personkeywords personkeywords on persons.id = personkeywords.personid
     inner join @searchkeywords searchkeywords on personkeywords.keyword = searchkeywords.keyword
where 
     searchkeywords.searchid = 1

给出

1     Babs
2     Ken
4     Sue

答案 1 :(得分:1)

虽然我没有太多可以使用的信息,但以下内容至少可以帮助您......

SELECT s.SearchID, k.Keyword, p.PersonID, p.Name
FROM Search s
INNER JOIN SearchKeywords sk ON s.SearchID = sk.SearchID
INNER JOIN Keywords k ON sk.KeywordID = k.KeywordID
LEFT OUTER JOIN PersonKeywords pk ON k.KeywordID = pk.KeywordID
LEFT OUTER JOIN Person p ON pk.PersonID = p.PersonID
WHERE k.Keyword = 'mykeyword'
GROUP BY s.SearchID, k.Keyword, p.PersonID, p.Name