返回丢失记录的t-sql查询

时间:2012-12-28 19:47:47

标签: sql tsql left-join missing-data

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

我需要一个返回没有上述查询中指定的FormTypes的一个或多个相关形式的Contacts的查询。

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

如果您有任何疑问,请与我们联系。

提前感谢您提出任何建议。

schema

3 个答案:

答案 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。