SQL根据inner join查询获取结果集
SQL Query to obtain result set based on inner join
SQL 需要帮助。
表格
- 人物(身份证、姓名)
- 消息(id,文本)
- PersonMsgResponse (msgID, personID, delMethod, received(Y/N)
PersonMsgResponse 的结构 table
- 消息 ID (MsgId)
- PersonID (PerID)
- MessageDeliveredBy (DelMethod)
- 已收到 (Y/N) (已收到)
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
SQL 需要帮助。
表格
- 人物(身份证、姓名)
- 消息(id,文本)
- PersonMsgResponse (msgID, personID, delMethod, received(Y/N)
PersonMsgResponse 的结构 table
- 消息 ID (MsgId)
- PersonID (PerID)
- MessageDeliveredBy (DelMethod)
- 已收到 (Y/N) (已收到)
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