1

我有一个查询 (ContactFormTypesRequired),它使用下面未显示的相关表返回 ContactID 和 FormTypeID。这是一个表单类型列表,每个联系人都应该将其作为表单关联起来。

我需要一个查询,该查询返回不具有上述查询中指定的 FormTypes 的一种或多种相关形式的联系人。

我尝试了从 Form 到 FormTypeID 上的 ContactsFormTypesRequired 的左外连接,但结果没有考虑到每个特定联系人应具有的 FormType。

请让我知道,如果你有任何问题。

提前感谢您的任何建议。

图式

4

3 回答 3

1

我正在以这种方式编写查询。这首先从您的查询开始以获取所需的表单作为 CTE,然后将它们交叉连接到联系人以获取每个所需的组合,然后再加入实际的表单。

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
于 2012-12-28T21:03:48.467 回答
0

使用 NOT IN Cluase 试试这个简单的查询:

SELECT * FROM Contact
WHERE ContactID IN 
(SELECT ContactID FROM ContactForm 
INNER JOIN FORM ON ContactForm.FormID=Form.FormID
WHERE FormTypeID=@FormTypeID)
于 2012-12-28T20:08:26.230 回答
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 所需的 FormTypes 的所有 ContactID。

于 2013-01-03T20:51:55.603 回答