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

返回丢失记录的t-sql查询,sql,tsql,left-join,missing-data,Sql,Tsql,Left Join,Missing Data,我有一个查询(ContactFormTypesRequired),它使用下面未显示的相关表返回ContactID和FormTypeID。这是一个表单类型列表,每个联系人都应该将其作为表单进行关联 我需要一个查询,该查询返回的联系人没有上述查询中指定的FormType的一个或多个相关表单 我尝试了从表单到联系人的左外部联接FormTypeID上要求的FormTypes,但结果没有考虑每个特定联系人应有的FormTypes 如果你有任何问题,请告诉我 提前感谢您的建议 使用NOT IN CLUSE尝

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

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

我尝试了从表单到联系人的左外部联接FormTypeID上要求的FormTypes,但结果没有考虑每个特定联系人应有的FormTypes

如果你有任何问题,请告诉我

提前感谢您的建议


使用NOT IN CLUSE尝试此简单查询:

SELECT * FROM Contact
WHERE ContactID IN 
(SELECT ContactID FROM ContactForm 
INNER JOIN FORM ON ContactForm.FormID=Form.FormID
WHERE FormTypeID=@FormTypeID)

使用NOT IN CLUSE尝试此简单查询:

SELECT * FROM Contact
WHERE ContactID IN 
(SELECT ContactID FROM ContactForm 
INNER JOIN FORM ON ContactForm.FormID=Form.FormID
WHERE FormTypeID=@FormTypeID)

我是这样写这个问题的。这首先从您的查询开始,以获取作为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
与所需表单()
选择不同的c*
从触点c交叉连接
NeededForms nf左外连接
表格F
在nf.FormTypeId=f.FormTypeId左外连接上
接触式cf
在c.ContactId=cf.ContactId和
f、 FormId=cf.FormId
其中cf.FormId为空
我是这样做的,因此您可以用一个非常类似的查询来回答缺少哪些表单的查询:

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
与所需表单()
选择c.*,nf.FormTypeId
从触点c交叉连接
NeededForms nf左外连接
表格F
在nf.FormTypeId=f.FormTypeId左外连接上
接触式cf
在c.ContactId=cf.ContactId和
f、 FormId=cf.FormId
其中cf.FormId为空

我这样写查询。这首先从您的查询开始,以获取作为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
与所需表单()
选择不同的c*
从触点c交叉连接
NeededForms nf左外连接
表格F
在nf.FormTypeId=f.FormTypeId左外连接上
接触式cf
在c.ContactId=cf.ContactId和
f、 FormId=cf.FormId
其中cf.FormId为空
我是这样做的,因此您可以用一个非常类似的查询来回答缺少哪些表单的查询:

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
与所需表单()
选择c.*,nf.FormTypeId
从触点c交叉连接
NeededForms nf左外连接
表格F
在nf.FormTypeId=f.FormTypeId左外连接上
接触式cf
在c.ContactId=cf.ContactId和
f、 FormId=cf.FormId
其中cf.FormId为空

我创建了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
然后,将上述问题中所述的joined ContactFormTypes与外部联接连接到ContactFormTypeExist,以提供缺少相关FormTypeID的ConactIDs:

SELECT ContactFormTypesRequired.ConactID
FROM ContactFormTypeExist 
    RIGHT JOIN ContactFormTypesRequired 
        ON (ContactFormTypeExist.FormTypeID = ContactFormTypesRequired.FormTypeID) 
            AND (ContactFormTypeExist.ConactID = ContactFormTypesRequired.ConactID)
WHERE (((ContactFormTypeExist.ConactID) Is Null));

这将返回联系人缺少其ContactType所需的FormType的所有ContactID。

我创建的ContactFormType存在:

SELECT DISTINCT Contact.ContactID, Form.FormTypeID
FROM Contact 
    INNER JOIN ContactForm 
        ON Contact.ContactID = ContactForm.ContactID 
    INNER JOIN Form 
        ON ContactForm.FormID = Form.FormID
然后,将上述问题中所述的joined ContactFormTypes与外部联接连接到ContactFormTypeExist,以提供缺少相关FormTypeID的ConactIDs:

SELECT ContactFormTypesRequired.ConactID
FROM ContactFormTypeExist 
    RIGHT JOIN ContactFormTypesRequired 
        ON (ContactFormTypeExist.FormTypeID = ContactFormTypesRequired.FormTypeID) 
            AND (ContactFormTypeExist.ConactID = ContactFormTypesRequired.ConactID)
WHERE (((ContactFormTypeExist.ConactID) Is Null));

这将返回联系人缺少其ContactType所需的FormType的所有ContactID。

请发布您尝试的查询。我感谢大家的贡献。ContactFormTypesRequired基本上是一个从ContactJoin到ContactType join再到m2m ContactTypeFormType再到FormType的查询。如果我首先说明了这一点,您会使用ContactFormTypesRequired和下面的答案查找缺少指定表单类型的联系人吗。还是有更好的办法?请原谅我没有在最初的问题中给出细节。请发布您尝试过的问题。我感谢大家的贡献。ContactFormTypesRequired基本上是一个从ContactJoin到ContactType join再到m2m ContactTypeFormType再到FormType的查询。如果我首先说明了这一点,您会使用ContactFormTypesRequired和下面的答案查找缺少指定表单类型的联系人吗。还是有更好的办法?请原谅我没有在原始问题中提供详细信息。这只会找到根本没有
表单的
联系人
s。它找不到至少有一个
表单
但缺少一个或多个所需的
表单类型
联系人
。如果查询中没有所需的查看
联系人表单类型
引用,无论您做了多少次编辑,查询的时间有多长,或者查询产生的行集有多大,都将是错误的答案。@ErikE,别紧张,是的,我再次阅读了Results问题,我想我误解了与ContactFormTypes相关的问题部分,我会在一个新的答案中再写一次,然后在工作日后删除。所以你认为我反应过度或神经错乱了吗?这只会找到没有任何
表单的
联系人。它找不到至少有一个
表单
但缺少一个或多个所需的
表单类型
联系人
。如果查询中没有所需的查看
联系人表单类型
引用,无论您做了多少次编辑,查询的时间有多长,或者查询产生的行集有多大,都将是错误的答案。@ErikE,别紧张,是的,我再次阅读了Results问题,我想我误解了与ContactFormTypes相关的问题部分,我会在一个新的答案中再写一次,然后在工作日后删除。所以你认为我反应过度或神经错乱还是什么?ContactFormTypesRequired不返回FormID,它返回FormTypeID。例如,表单类型可能是应用程序。联系人可能有一个应用程序的多个实例,每个实例都由FormID表示。我会用它吗