Коррелированный запрос с более чем одной таблицей SQL - PullRequest
0 голосов
/ 02 января 2019

Мне нужно перечислить некоторые данные о сотрудниках, которые зарегистрированы для 2 или более курсов, используя подзапрос.Staff_id в таблице staff связан с таблицей курсов, поэтому 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 голосов
/ 02 января 2019

Если вам нужны только данные о персонале, или вы можете 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)
        );

или через объединение даже в соединении, вы должны указать причину подзапроса, равную 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)
0 голосов
/ 02 января 2019

Вам нужно будет связать свой подзапрос с основным запросом.В данный момент вы просто ищете ЛЮБОГО сотрудника, который имеет более двух курсов в вашем подзапросе.Попробуйте следующее (не проверено).

Для ясности, особенно когда вы используете подзапросы, рекомендуется создать псевдонимы для всех ваших таблиц.

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)
0 голосов
/ 02 января 2019

Если вы хотите, чтобы персонал имел более одного курса, 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
                    );
0 голосов
/ 02 января 2019

Я думаю, что вам не нужен коррелированный подзапрос.Совокупный запрос JOIN с предложением HAVING должен это делать, например:

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
;

Это позволит получить всех сотрудников, у которых есть хотя бы два курса.

...