2015-12-14 60 views
1

需要SQL幫助。通過SQL查詢獲取基於內部聯接的結果集

  • 人(ID,姓名)
  • 消息(ID,文本)
  • PersonMsgResponse(MSGID,PERSONID,delMethod,接收(Y/N)

結構PersonMsgResponse表

  • MessageID(MsgId )
  • 是PersonID(PerID)
  • MessageDeliveredBy(DelMethod)
  • 收到的(Y/N)(接收)PersonMsgResponse表內

實施例的行

Example Rows within PersonMsgResponse table

我需要返回未收到消息的人員名單。

我該如何設計SQL以僅返回那些未通過任何方法接收到消息的成員的成員名稱?

例如,在我上面的查詢記錄列表應僅返回成員自1件2收到電話方式的消息,而會員1未通過任何方法來接收消息。

感謝您的幫助。

回答

2

您可以使用下面的2個內部查詢來完成此操作。訣竅是包含所有收到'N'但沒有'Y'的人員。在這個例子中,消息表在技術上是不必要的。

SELECT p.Name 
FROM Person p 
WHERE p.id IN ( 
        SELECT personID 
        FROM PersonMsgResponse pmr 
        WHERE pmr.received = 'N' AND pmr.personID NOT IN (SELECT personID FROM PersonMsgResponse pmr WHERE pmr.received = 'Y') 
       ) 

這將返回

Name 
person 1 
+0

這添加了消息ID的技巧。最終查詢如下所示: – Tim

+0

SELECT m.Person ID FROM Person p WHERE m.PersonID IN(SELECT MemberID FROM PersonMsgResponse pmr WHERE pmr.MessageID = 1 AND pmr.Received ='N'AND pmr.PersonID not in(SELECT MemberID FROM PersonMsgResponse pmr WHERE pmrMessageID = 1 AND pmr.Received ='Y')) – Tim

0

更新:

您可以使用子查詢NOT EXISTS():如果你想從個人表名

select MsgID, PerID from PersonMsgResponse p1 
inner join PersonMsgResponse p3 on p1.MsgID=p3.MsgId and p1.PerID=32.PerID and p3.Received='N' 
where not exists(select 1 from PersonMsgResponse p2 where p1.MsgID=p2.MsgId and p1.PerID=p2.PerID and p2.Received='Y') 

,然後就內部連接的個人表上P1。

+0

這不起作用,因爲它返回的消息沒有發送給個人。 – Tim

+0

@Tim檢查更新的答案 – Shadow

1

您可以使用NOT EXISTS

SELECT Id, Name 
FROM Person AS p 
WHERE NOT EXISTS (SELECT 1 
        FROM PersonMsgResponse AS pmr 
        WHERE p.Id = pmr.personID AND p.Received = 'Y' AND 
         p.MessageID = 1) 
     AND EXISTS (SELECT 1 
        FROM PersonMsgResponse AS pmr 
        WHERE p.Id = pmr.personID AND p.MessageID = 1) 

上面的查詢將返回的人員名單未在可用方法的任何收到特定消息。

+0

這不起作用,因爲它返回消息未發送到的人員。 – Tim

+0

@Tim檢查我所做的修改。 –

0
select PersonTable.Person 
From  Person as PersonTable inner join PersonMsgResponse as ResponseTable 
     on PersonTable.Id = ResponseTable.PerId 
where ResponseTable.Received = 'n' 

SELECT語句添加鮮明既然這麼

Select Distinct (PersonTable.Person) 

如果你不想重複人士

UPDATE

從您的評論中,更改值,因此沒有人可以收到'y'

select Distinct (PersonTable.Id) , PersonTable.Name, ResponseTable.Received 
From  Person as PersonTable inner join PersonMsgResponse as ResponseTable 
     on PersonTable.Id = ResponseTable.PerId 
where ResponseTable.Received != 'Y' 
+0

這不起作用,因爲它會將消息發送到的人員以其他方法打開時返回的人員。 – Tim