SQL根据inner join查询获取结果集

SQL Query to obtain result set based on inner join

SQL 需要帮助。

表格

PersonMsgResponse 的结构 table

PersonMsgResponse 中的示例行 table

我需要return一个没有收到消息的人名列表。

如何将 SQL 设置为仅 return 未通过任何方法收到消息的成员的成员名称?

例如,在上面的记录列表中,我的查询应该只有 return 成员 1,因为成员 2 通过 phone 调用收到了消息,而成员 1 没有收到消息两种方法中的一种。

感谢您的帮助。

更新:

您可以使用 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')

如果你想要来自 table 的人的名字,那么只需在 p1 上加入 table 的人。

您可以使用 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)

上述查询将 return 未收到 特定 消息的人员列表 any方法。

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

将 Distinct 添加到 select 语句中

Select Distinct (PersonTable.Person)

如果你不想重复人物

更新

根据您的评论,更改值,这样就没有人可以收到'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'

您可以使用如下所示的 2 个内部查询来完成此操作。诀窍是包括所有收到 'N' 但没有 'Y' 的人。消息 table 对于此示例在技术上是不必要的。

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')
                )

这个returns

Name
person 1