我需要列出一些使用子查询注册了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);
答案 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)