0

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

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

然后我还有一个 Search 表,它还通过 SearchKeywords 表与关键字建立了 N:N 关系。

现在人可以和关键字A和B有关系,搜索记录可以和关键字A和C有关系。

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

我也想要有'A'的人,有'C'的人,有'A'和'C'的人,但不是只有B的人。

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

4

2 回答 2

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
于 2012-10-31T09:52:35.813 回答
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
于 2012-10-31T09:55:11.620 回答