有两个表,一个Contact表和一个RelationshipHistory表。
联系人可以具有多种类型的关系(业务关系、个人关系、志愿者关系等),这意味着随着时间的推移,他们可以在RelationshipHistory表中拥有多个引用。每个关系行都有一个列,该列指示与该关系相关的事件。因此,例如,联系ContactID 123的John Smith在RelationshipHistory表中可能有两行: 123,个人,有趣事件和123,志愿者,无聊事件。我需要执行的查询是“获取所有与事件”有趣事件“和事件”无聊事件“有关系的联系人”。
我最初认为这样的查询会起作用:
SELECT DISTINCT LastName, FirstName
FROM Contacts
JOIN RelationshipHistory ON RelationshipHistory.ContactKey = Contacts.ContactGUID
WHERE RelationshipHistory.Event = 'Fun Event'
AND RelationshipHistory.Event = 'Boring Event'但是它不会返回任何结果。当我再次查看查询时,我意识到这是不可能的,因为比较发生在行上,并且列中的值同时等于两个不同的值是没有意义的。
这个查询看起来很简单,但仔细观察一下,我不知道如何查找列上具有两个或更多个值的匹配值的行。
有没有什么方法可以使用inner或join,或者我必须将结果转储到临时表中…?
发布于 2010-08-28 10:56:06
使用:
SELECT LastName, FirstName
FROM Contacts c
JOIN RelationshipHistory re ON re.ContactKey = c.ContactGUID
AND re.Event IN ('Fun Event', 'Boring Event')
GROUP BY LastName, FirstName
HAVING COUNT(DISTINCT re.contactkey) = 2您的查询不起作用,因为它希望RELATIONSHIPHISTORY.contactkey同时为两个值,这是不可能的。这意味着您需要使用OR,或者使用IN子句,它是同一列上多个or的简写形式。但是,IN子句不支持任何形式的模式匹配-您需要使用全文搜索(FTS)功能来实现...
这个查询的另一部分是HAVING子句-它计算不同的有趣事件值,因为如果它们不是不同的,重复的“contactkey”将是误报。
要使查询正常工作,IN子句的数量必须与所计数的distinct值的数量相匹配。因此,如果要查找三个或五个事件,则需要更新HAVING子句。
https://stackoverflow.com/questions/3589238
复制相似问题