具有多个表SQL的关联查询

时间:2019-01-01 21:42:17

标签: sql oracle correlated-subquery

我需要列出一些使用子查询注册了2个或更多课程的人员详细信息。 人员表中的staff_id链接到课程表,因此s.staff_id = c.staff_id。但是我真的很困惑,不知道如何纠正。

SELECT STAFF.STAFF_ID, STAFF.FIRST_NAME, STAFF.LAST_NAME, STAFF.TITLE, COURSE.ID 
FROM STAFF, COURSE C
WHERE STAFF.STAFF_ID = COURSE.STAFF_ID
AND (SELECT COURSE.COURSE_ID FROM COURSE 
GROUP BY STAFF.STAFF_ID
HAVING COUNT(COURSE.COURSE_ID) >=2);

4 个答案:

答案 0 :(得分:1)

我认为您不需要相关的子查询。带有HAVING子句的聚集JOIN查询应该做到这一点,例如:

SELECT
    S.STAFF_ID, 
    S.FIRST_NAME,
    S.LAST_NAME, 
    S.TITLE 
FROM 
    STAFF AS S
    INNER JOIN COURSE AS C
        ON S.STAFF_ID = C.STAFF_ID
GROUP BY
    S.STAFF_ID, 
    S.FIRST_NAME,
    S.LAST_NAME, 
    S.TITLE
HAVING 
    COUNT(*) >=2
;

这将检索所有至少有两门课程的员工。

答案 1 :(得分:0)

您需要将子查询链接回主查询。目前,您只是在寻找子查询中具有两门以上课程的任何工作人员。尝试以下(未经测试)。

为清楚起见,尤其是在使用子查询时,最好为所有表加上别名。

SELECT S.STAFF_ID, S.FIRST_NAME, S.LAST_NAME, S.TITLE 
FROM STAFF S, COURSE C
WHERE S.STAFF_ID = C.STAFF_ID
AND (SELECT C1.COURSE_ID FROM COURSE c1
     where s.staff_id = c1.staff_id
     HAVING COUNT(C1.COURSE_ID) >=2)

以上假设您当然也需要删除一些列,但是目前您没有任何选择,因此如果您当然不需要任何内容​​,则可以将查询进一步简化为以下内容。 / p>

SELECT S.STAFF_ID, S.FIRST_NAME, S.LAST_NAME, S.TITLE 
FROM STAFF S
where (SELECT C.COURSE_ID FROM COURSE c
     where s.staff_id = c.staff_id
     HAVING COUNT(C.COURSE_ID) >=2)

答案 2 :(得分:0)

如果您想让员工参加一门以上的课程,则不需要join -隐式或显式。这是一种更直接的方法:

select s.*
from staff s
where s.staff_id in (select c.staff_id
                     from course c
                     group by c.staff_id
                     having count(*) >= 2
                    );

答案 3 :(得分:0)

如果您只需要职员详细信息,或者也可以join(如果需要的话也可以提供课程信息)

      SELECT Staff.* from Staff s where   
        s.staff_id in 
     (Select 
     staff_id from
           (SELECT  COURSE_ID,STAFF_ID
           FROM COURSE 
            GROUP BY STAFF_ID
       HAVING COUNT(COURSE.COURSE_ID) >=2)
        );

或通过加入事实,即使在加入时,当按s.staff_id分组时,也需要一个子查询原因为group by,c.course_id值将变得不一致并且与s.staff_id不同步

           Select s.* ,c.COURSE_ID from staff s
            join course c
            on s.staff_id IN (Select c.staff_id group by 
               c.staff_id
             HAVING COUNT(*) >=2)