SQL查询以获取缺少的工作人员

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

我有以下问题要找出一个项目中是否缺少具有特定工作角色的用户:

表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          | 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”