具有多个 table SQL 的相关查询

Correlated Query with more than one table SQL

我需要使用子查询列出一些注册了 2 门或更多课程的员工详细信息。 职员 table 中的 staff_id 链接到课程 table,因此 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);

我认为您不需要相关子查询。带有 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
;

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

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

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

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)

以上假定您当然也需要删除一些列,但是目前您的第一个 select 中有 none,因此查询可以进一步简化为以下如果您不需要课程中的任何内容。

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)

如果您希望员工拥有不止一门课程,则 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
                    );

如果您只需要员工详细信息,或者如果需要课程详细信息,也可以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)
        );

或通过 join 事实上,即使在 join 中,您也需要一个子查询原因 group by 当按 s.staff_id 分组时,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)