具有多个 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)
我需要使用子查询列出一些注册了 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)