复杂sql server查询

复杂sql server查询,sql,sql-server,tsql,select,Sql,Sql Server,Tsql,Select,我需要一些关于我正在处理的SQL查询的帮助。这是我正在处理的数据的简化版本。我有三张桌子: 联系人: - ContactID - ContactName - SubmissionID - ContactID - SubmissionTypeID - SubmissionTypeID - SubmissionType 提交内容: - ContactID - ContactName - SubmissionID - ContactID - SubmissionTypeID - Submis

我需要一些关于我正在处理的SQL查询的帮助。这是我正在处理的数据的简化版本。我有三张桌子:

联系人

- ContactID
- ContactName
- SubmissionID
- ContactID
- SubmissionTypeID
- SubmissionTypeID
- SubmissionType
提交内容

- ContactID
- ContactName
- SubmissionID
- ContactID
- SubmissionTypeID
- SubmissionTypeID
- SubmissionType
提交类型

- ContactID
- ContactName
- SubmissionID
- ContactID
- SubmissionTypeID
- SubmissionTypeID
- SubmissionType
我需要返回所有联系人(加入
ContactID
上的
submissiontypeid
),其中有与
submissiontypeid
列表匹配的
submissiontypeid
。棘手的部分是,我只希望联系人的提交记录具有与列表中的每个值匹配的
SubmissionTypeID
。例如,如果我有这些数据:

Contacts
----------------
1 | Jim Johnson
2 | Sally Anderson

SubmissionTypes
----------------------
1 | Contact Form
2 | Request Form   
3 | Generic Form

Submissions
----------------------
1 | 1 | 1 
2 | 1 | 2  
3 | 2 | 1
如果我的
SubmissionTypeID
值为1和2,我希望得到以下结果:

Jim Johnson | Contact Form 
Jim Johnson | Request Form
我不想见到Sally Anderson,因为她没有两个值的提交记录

我想有几种方法可以做到这一点。我很高兴看到你的想法


谢谢大家!

一种方法是使用INTERSECT:

select c.contactname, t.submissiontype
  from contacts c
  join submissions s
    on c.contactid = s.contactid
  join submissiontypes t
    on s.submissiontypeid = t.submissiontypeid
  join (select c.contactid
          from contacts c
          join submissions s
            on c.contactid = s.contactid
         where s.submissiontypeid = 1
        intersect
        select c.contactid
          from contacts c
          join submissions s
            on c.contactid = s.contactid
         where s.submissiontypeid = 2) v
    on c.contactid = v.contactid
 where s.submissiontypeid in (1, 2)
小提琴:

您还可以计算等于2的值(您有两个要检查的值):


小提琴:

这里有一种使用双重否定的复杂方法

declare @list table (SubmissionTypeID int not null primary key);

insert into @list values (1), (2); -- values to search for.

with c as (
    select
        c.ContactID,
        c.ContactName
    from
        Contacts c
    where
        not exists (
            select
                'x'
            from
                @list l
            where
                not exists (
                    select
                        'x'
                    from
                        Submissions s
                    where
                        s.ContactID = c.ContactID and
                        s.SubmissionTypeID = l.SubmissionTypeID
                )
        )
)
select
    c.ContactName,
    t.SubmissionType
from
    c
        inner join
    Submissions s
        on c.ContactId = s.ContactId
        inner join
    SubmissionTypes t
        on s.SubmissionTypeID = t.SubmissionTypeID
        inner join
    @list l
        on t.SubmissionTypeID = l.SubmissionTypeID;

根据其他约束条件,
具有count(*)=2
可能需要
具有count(distinct submissiontypeid)=2
+但是,@Laurence同意,通常默认情况下我不会使用distinct,但我只是编辑了它,因为一个联系人可能有多个相同类型的提交。