MySQL - 如何找不到IN CLAUSE的匹配结果

时间:2015-10-09 13:23:06

标签: mysql

我有以下SQL语句,它使我不能从表tblscr_role匹配,但我想找出与NOT IN CLAUSE.9('ROLE1','ROLE2','ROLE3','ROLE4')中的值集值不匹配的内容。我该怎么做?

以下是我的SQL示例:

select role_name 
from tblscr_role 
where requestid = 9681 
and role NOT IN ('ROLE1','ROLE2','ROLE3','ROLE4')

1 个答案:

答案 0 :(得分:0)

也许你是在追求这样的事情:SQL Fiddle

我们使用外部联接从tblsrc_role获取结果,并为要匹配的角色创建内联视图,然后以两种方式查看角色tblsrc_role中的所有角色不在角色列表中,角色中的所有角色都不在tblsrc_role然后我们将这些结果结合在一起......

通常可以通过FULL OUTER JOIN完成;但我不相信mySQL支持它们,因此左右和联合模拟一个完整的外连接。

Select S1.role, B.Role, S1.RequestID 
from tblSrc_role S1
LEFT JOIN 
(
  SELECT 'ROLE1' as role UNION ALL
  SELECT 'ROLE2' UNION ALL
  SELECT 'ROLE3' UNION ALL
  SELECT 'ROLE4') B
  on S1.Role = b.Role
WHERE S1.RequestID = 9681
UNION
Select S1.Role, B.role, S1.RequestID
from tblSrc_role S1
RIGHT JOIN 
( SELECT 'ROLE1' as role UNION ALL
  SELECT 'ROLE2' UNION ALL
  SELECT 'ROLE3' UNION ALL
  SELECT 'ROLE4') B
  on S1.Role = b.Role
  and S1.RequestID = 9681

如果您想查找列表中哪些不在系统中:

Select S1.Role, B.role, S1.RequestID
from tblSrc_role S1
RIGHT JOIN 
( SELECT 'ROLE1' as role UNION ALL
  SELECT 'ROLE2' UNION ALL
  SELECT 'ROLE3' UNION ALL
  SELECT 'ROLE4') B
  on S1.Role = b.Role
where s1.requestID is null

您遇到的问题是您要返回的数据未存储在数据库中,因此无法返回不存在的数据。通过创建内联视图,传入角色,系统可以返回不在现有集中的值。 B.Role将包含不在系统S1中的角色列表。对于那些不存在的角色,SR.Role和S1.RequestID将为空。

虽然您可以返回B.Role来获取不存在的角色。