[英]Complex sql server query
我正在處理的SQL查詢需要一些幫助。 這是我正在使用的數據的簡化版本。 我有3張桌子:
聯系人 :
- ContactID
- ContactName
提交內容 :
- SubmissionID
- ContactID
- SubmissionTypeID
提交類型 :
- SubmissionTypeID
- SubmissionType
我需要返回所有聯系人(接合到Submissions
關於ContactID
那里有) SubmissionTypeIDs
匹配與列表, SubmissionTypeIDs
。 棘手的部分是,我只需要一個聯系人具有Submission記錄且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,因為她在Submissions中沒有這兩個值的記錄。
我猜有幾種方法可以做到這一點。 我很高興看到您的想法。
謝謝!
一種方法是使用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)
小提琴: http ://sqlfiddle.com/#!6/9ee4e/2/0
您也可以在COUNT等於2的位置(您要檢查的2個值):
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 in (1, 2)
group by c.contactid
having count(distinct s.submissiontypeid) = 2) v
on c.contactid = v.contactid
where s.submissiontypeid in (1, 2)
小提琴: http ://sqlfiddle.com/#!6/9ee4e/1/0
這是使用雙重否定的復雜方法。
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;
Try this.. It works fine to me
DECLARE @list TABLE (SubmissionTypeID int not null primary key);
INSERT INTO @list VALUES(1); -- values to search for.
SELECT C.ContactName, ST.SubmissionTypeName
FROM
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY S.ContactID ORDER BY S.ContactID) AS RCount
FROM
Submission S
WHERE EXISTS
(SELECT 1 FROM @list l WHERE l.SubmissionTypeID = S.SubmissionTypeID)) AS Result
INNER JOIN Submission S1 ON S1.ContactID = Result.ContactID
INNER JOIN Contacts C ON C.ContactID = Result.ContactID
INNER JOIN SubmissionTypes ST ON ST.SubmissionTypeID = S1.SubmissionTypeID
WHERE RCOunt = (SELECT COUNT(DISTINCT SubmissionTypeID) FROM @list)
AND EXISTS
(SELECT 1 FROM @list l WHERE l.SubmissionTypeID = ST.SubmissionTypeID)
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.