【问题标题】:Correlated Query with more than one table SQL具有多个表 SQL 的关联查询
【发布时间】:2019-01-01 21:42:16
【问题描述】:

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

【问题讨论】:

    标签: sql oracle correlated-subquery


    【解决方案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
    ;
    

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

    【讨论】:

      【解决方案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
                          );
      

      【讨论】:

        【解决方案3】:

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

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

        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 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)
        

        【讨论】:

        • 啊我忘了我需要在第一部分选择 course_id
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2016-12-19
          • 1970-01-01
          • 2011-05-29
          • 1970-01-01
          • 2013-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多