簡體   English   中英

復雜的SQL Server查詢

[英]Complex sql server query

我正在處理的SQL查詢需要一些幫助。 這是我正在使用的數據的簡化版本。 我有3張桌子:

聯系人

- ContactID
- ContactName

提交內容

- SubmissionID
- ContactID
- SubmissionTypeID

提交類型

- SubmissionTypeID
- SubmissionType

我需要返回所有聯系人(接合到Submissions關於ContactID那里有) SubmissionTypeIDs匹配與列表, SubmissionTypeIDs 棘手的部分是,我只需要一個聯系人具有Submission記錄且SubmissionTypeIDSubmissionTypeID中的每個值都匹配的結果。 因此,例如,如果我有以下數據:

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;

示例SQLFiddle

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM