SQL查询以获取缺少的工作人员
我有以下问题要找出一个项目中是否缺少具有特定工作角色的用户: 表1:SQL查询以获取缺少的工作人员,sql,sybase,Sql,Sybase,我有以下问题要找出一个项目中是否缺少具有特定工作角色的用户: 表1: ID | Project_ID ---+------------ 1 | 11A 1 | 11B 1 | 11C 2 | 12B 2 | 12C 3 | 13A 3 | 13C 表2: Project_ID | JobRole_ID -------------+------------ 11A | A 11B | B 11C | C 12B
ID | Project_ID
---+------------
1 | 11A
1 | 11B
1 | 11C
2 | 12B
2 | 12C
3 | 13A
3 | 13C
表2:
Project_ID | JobRole_ID
-------------+------------
11A | A
11B | B
11C | C
12B | B
12C | C
13A | A
13C | C
表3:
JobRole_ID | JobRole
-----------+---------
A | Manager
B | Project Leader
C | Project Assistent
对于每个项目工作角色A、B和C都是必需的(表3)。表2仅包含添加的JobRoles,而不是缺少的JobRoles
我所期望的是:
ID | JobRole
---+---------
1 | Manager
2 | NULL
3 | Manager
请帮帮我!Thx您希望查找存在未绑定到此特定项目的JobRole的项目 从我的头顶:
--try to find projects
SELECT
T1.Id
FROM
Table1 AS T1
WHERE
--with at least one role
EXISTS(
SELECT
*
FROM
Table3 AS T3
WHERE
--where mapping does not exist
NOT EXISTS(
SELECT
*
FROM
Table2 AS T2
WHERE
T2.Project_ID = T1.Project_ID AND
T2.JobRole_ID = T3.JobRole_ID
)
)
编辑:
这是你想要的吗?如果没有,你能告诉我们更多细节吗
SELECT
T1.Id, T3.JobRole_ID
FROM
Table1 AS T1 LEFT JOIN
Table2 AS T2 ON T2.Project_ID = T1.Project_ID LEFT JOIN
Table3 AS T3 ON T3.JobRole_ID = T2.JobRole_ID
以下是一种方法:
select p.*, j.*
from projects p cross join
jobroles j left join
projectjobs pj
on p.project_id = pj.project_id and
j.jobrole_id = pj.jobrole_id
where pj.project_id is null;
它生成所有项目和所有作业的列表(使用交叉联接
)。然后,使用left join
和where
子句,它过滤掉存在的那些
编辑:
您可以尝试使用逗号:
select p.*, j.*
from projects p,
jobroles j left join
projectjobs pj
on p.project_id = pj.project_id and
j.jobrole_id = pj.jobrole_id
where pj.project_id is null;
但这可能不起作用,因为在from
子句中逗号是如何解析的。您可能需要一个子查询:
select xpj.*
from (select p.*, j.*
from projects p, jobroles j
) xpj left join
projectjobs pj
on xpj.project_id = pj.project_id and
xpj.jobrole_id = pj.jobrole_id
where pj.project_id is null;
根据您更新的要求,这应该可以工作,尽管我相信它可以简化
select a.ID, b.JobRole
from (
select * from Table1, table3 where JobRole_ID = 'A'
) a left join (
select t1.id, t3.jobrole
from table1 t1
left join table2 t2 on t2.project_id = t1.project_id
left join table3 t3 on t3.jobrole_id = t2.jobrole_id
) b on a.id = b.id and a.jobrole = b.jobrole
group by a.ID, b.JobRole
OP声明所有3个Jobrole都是必需的。@KasparsOzols问题以:现在我想知道缺少Jobrole“A”的表1的ID。这正是这个问题的答案。也许我解释得太狭隘了。OP指定了项目13缺少的A,而不是缺少的B。@matd我以为这是你想要的,但如果不是,你能描述一下你期望/想要的输出吗?@KasparsOzols我在定义中犯了一个错误。请再看一看。thx@jpw我在定义中犯了一个错误,请再次查看帮助。此查询的缺点(或优点,如果您需要缺少角色)是,如果缺少多个JobRole,它将返回多行。它可以很容易地用
DISTINCT
关键字来修复。@KasparsOzols。此形式的查询不会返回重复项(除非项目
或作业角色
具有重复项)。至于Sybase ASE为什么不理解这个查询,我不知道。这是ANSI标准SQL语法。@GordonLinoff我犯了一个错误,请再看看我的定义。thx以这种方式交叉连接Sybase工作,“来自项目p,工作角色j”