选择数据的SQL查询

选择数据的SQL查询,sql,Sql,我需要一些关于SQL查询的帮助 我有3张表-人员、角色和任务 人员表包含识别人员的唯一编号 角色表包含两列,一列是唯一标识角色的主键,另一列是角色名称 分配表包含两列,第一列是个人的外键,第二列是角色的外键,基本上显示了哪个人属于哪个角色 为了简化,让我们将数据想象为: 人员表 角色表 分配表 现在,我需要编写一个查询,该查询只返回不属于以TEST开头的角色的人。一个用户可以属于任意数量的角色,但我需要找到没有分配任何测试角色的用户。因此,使用我的示例,它应该只返回P3 看起来很简单,但我

我需要一些关于SQL查询的帮助

我有3张表-人员、角色和任务

人员表包含识别人员的唯一编号
角色表包含两列,一列是唯一标识角色的主键,另一列是角色名称
分配表包含两列,第一列是个人的外键,第二列是角色的外键,基本上显示了哪个人属于哪个角色

为了简化,让我们将数据想象为:

人员表

角色表

分配表

现在,我需要编写一个查询,该查询只返回不属于以TEST开头的角色的人。一个用户可以属于任意数量的角色,但我需要找到没有分配任何测试角色的用户。因此,使用我的示例,它应该只返回P3

看起来很简单,但我有点卡住了,我想不出来

任何帮助都将不胜感激


如果有帮助,我正在使用Oracle 11g后端。

使用
不存在
。像这样:

SELECT p.personid
FROM person_table p
WHERE not exists ( SELECT 'any test role for person' 
                   FROM   assignment_table a INNER JOIN role_table r ON r.roleid = a.fk_roleid
                   WHERE  r.role_name like 'Test\_%' escape '\'
                   AND    a.fk_personid = p.person_id )

连接表,然后使用not like

SELECT a.FK_PersonID 
FROM Assignment a 
JOIN Roles r
ON r.RoleID = a.FK_RoleID
WHERE r.RoleName NOT LIKE "TEST_%"

你自己试过什么吗?StackOverflow不应该做你的家庭作业。既然你提到它,它看起来确实有点像教科书。我应该删除我的答案吗?我保证这不是家庭作业:)。我是SQL的新手,今天休息一天。我已经简化了我的例子很多,但实际的需求更复杂,但这是关键的缺失片段哦,我刚刚注意到你说的是Oracle,我的答案是MySQL。我不熟悉甲骨文,所以如果这不起作用,我道歉。真的吗?例如,此查询在结果中不包括P1?是的,它返回2个P1(R2,R3)、1个P2(R2)和2个P3(R2,R3)。