【问题标题】:SQL Query to select data用于选择数据的 SQL 查询
【发布时间】:2016-05-19 17:36:08
【问题描述】:

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

我有 3 个表 - 人员、角色和分配

Person 表包含用于识别个人的唯一编号
角色表包含​​两列,一列是唯一标识角色的主键,二列是角色名称。
分配表包含 2 列,第一列是人的外键,第二列是角色的外键,本质上是向我们展示了哪个人属于哪个角色

为简化起见,让我们将数据视为:

人员表

角色表

作业表

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

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

任何帮助将不胜感激

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

【问题讨论】:

  • 您自己尝试过吗? StackOverflow 不应该帮你做作业。
  • 嗯。既然您提到它,它确实 似乎是一本小教科书。我应该删除我的答案吗?
  • 我向你保证这不是家庭作业:)。我对 SQL 很陌生,今天我休息了一天。我已经简化了很多示例,但实际要求更复杂,但这是关键的缺失部分

标签: sql


【解决方案1】:

加入表格然后使用不喜欢。

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

【讨论】:

  • 糟糕,我刚刚注意到您说 Oracle,而我的答案是在 MySQL 中。我不熟悉 Oracle,所以如果这不起作用,我深表歉意。
  • 真的吗?例如,此查询在结果中不包括 P1?
  • 是的,它返回 2 个 P1s(R2, R3)、1 个 P2(R2) 和 2 个 P3s(R2, R3)。
【解决方案2】:

使用not exists。像这样:

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 )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多