2012-12-28 89 views
1

我有一个查询(ContactFormTypesRequired),它使用下面未显示的相关表返回ContactID和FormTypeID。这是每个联系人应将其作为窗体与之关联的FormType列表。返回缺失记录的t-sql查询

我需要一个查询,返回没有一个或多个相关形式的上述查询中指定的FormType的联系人。

我已经尝试了FormType到FormFormTypesRequired上的左外部联接,但结果没有考虑到每个特定联系人应该有的FormTypes。

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

非常感谢您的任何建议。

schema

+3

请发布您尝试的查询。 –

+0

我很感谢大家的贡献。 ContactFormTypesRequired基本上是一个从Contact连接到ContactType连接到从m2m ContactTypeFormType到FormType的查询。如果我首先表明了这一点,那么您是否会使用ContactFormTypesRequired查找联系人缺少指定表单类型的问题,以及下面的答案。或者,还有更好的方法?请原谅我在原始问题中没有提供这些细节。 – cResults

回答

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)); 

这将返回联系人所有联系人ID缺少其联系人类型所需的FormType。

0

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

SELECT * FROM Contact 
WHERE ContactID IN 
(SELECT ContactID FROM ContactForm 
INNER JOIN FORM ON ContactForm.FormID=Form.FormID 
WHERE [email protected]) 
+1

这只能找到没有'Form'的联系人。它没有找到'联系人',他们至少有一个'Form',但缺少一个或多个额外的必需'FormType',如'ContactFormTypesRequired'视图所发现的。 – ErikE

+0

ops抱歉,省略了NOT,现在应该可以工作:) –

+0

如果您在查询中没有“ContactFormTypesRequired”引用的视图,那么无论您进行了多少次编辑或查询的时间或者如何摧毁行集,产生,这将是*错误的答案*。 – ErikE

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 
+0

正是如此。正确的方式。 – ErikE

+0

ContactFormTypesRequired不返回FormID,它返回FormTypeID。例如,表单类型可能是应用程序。联系人可能有一个应用程序的多个实例,每个应用程序都由FormID表示。我是否会在查询中使用FormTypeID代替FormID来查找ContactType要求他们具有应用程序的联系人,但他们没有? – cResults

+0

我修改了基于数据模型改进描述的查询。 –