我有一个查询(ContactFormTypesRequired),它使用下面未显示的相关表返回ContactID和FormTypeID。这是一个FormTypes列表,每个联系人都应该将其作为表单与之相关。
我需要一个返回没有上述查询中指定的FormTypes的一个或多个相关形式的Contacts的查询。
我在FormTypeID上尝试了从Form到ContactsFormTypesRequired的左外连接,但结果没有考虑每个特定联系人应该具有的FormTypes。
如果您有任何疑问,请与我们联系。
提前感谢您提出任何建议。
答案 0 :(得分:1)
我正在用这种方式编写查询。首先从您的查询开始,将所需的表单作为CTE获取,然后将它们交叉连接到Contacts以获取所有需要的组合,然后再连接到实际表单。
with NeededForms (<yourqueryhere>)
select distinct c.*
from Contact c cross join
NeededForms nf left outer join
Form F
on nf.FormTypeId = f.FormTypeId left outer join
ContactForm cf
on c.ContactId = cf.ContactId and
f.FormId = cf.FormId
where cf.FormId is null
我这样做,所以你可以用一个非常相似的查询来回答缺少哪些表格的查询:
with NeededForms (<yourqueryhere>)
select c.*, nf.FormTypeId
from Contact c cross join
NeededForms nf left outer join
Form F
on nf.FormTypeId = f.FormTypeId left outer join
ContactForm cf
on c.ContactId = cf.ContactId and
f.FormId = cf.FormId
where cf.FormId is null
答案 1 :(得分:0)
使用NOT IN子句尝试这个简单的查询:
SELECT * FROM Contact
WHERE ContactID IN
(SELECT ContactID FROM ContactForm
INNER JOIN FORM ON ContactForm.FormID=Form.FormID
WHERE FormTypeID=@FormTypeID)
答案 2 :(得分:0)
我创建了ContactFormTypeExist:
SELECT DISTINCT Contact.ContactID, Form.FormTypeID
FROM Contact
INNER JOIN ContactForm
ON Contact.ContactID = ContactForm.ContactID
INNER JOIN Form
ON ContactForm.FormID = Form.FormID
然后将上面问题中描述的ContactFormTypesRequired加入ContactFormTypeExist并使用外连接为我提供缺少相关FormTypeID的ConactID:
SELECT ContactFormTypesRequired.ConactID
FROM ContactFormTypeExist
RIGHT JOIN ContactFormTypesRequired
ON (ContactFormTypeExist.FormTypeID = ContactFormTypesRequired.FormTypeID)
AND (ContactFormTypeExist.ConactID = ContactFormTypesRequired.ConactID)
WHERE (((ContactFormTypeExist.ConactID) Is Null));
这将返回其ContactType所需的所有ContactID缺少FormTypes的ContactID。