复杂sql server查询
我需要一些关于我正在处理的SQL查询的帮助。这是我正在处理的数据的简化版本。我有三张桌子: 联系人:复杂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
- 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,但我只是编辑了它,因为一个联系人可能有多个相同类型的提交。