2016-08-21 2 views
1

Я пытаюсь показать staff_code, staff_name и dept_name для тех, кто взял одну книгу.Запрос возвращает однострочный запрос более чем одной строки

Вот мой запрос:

SELECT SM.STAFF_CODE,SM.STAFF_NAME,DM.DEPT_NAME,BT.BOOK_CODE 
FROM STAFF_MASTER SM,DEPARTMENT_MASTER DM,BOOK_TRANSACTIONS BT 
WHERE SM.DEPT_CODE =DM.DEPT_CODE 
AND SM.STAFF_CODE = (
    SELECT STAFF_CODE 
    FROM BOOK_TRANSACTIONS 
    HAVING COUNT(*) > 1 
    GROUP BY STAFF_CODE) 

Это дает ошибку:

single-row subquery returns more than one row.

Как решить эту проблему?

+0

помещает вложенный запрос в предложение 'HAVING' – PSD

ответ

1

Изменение = в IN:

WHERE SM.STAFF_CODE IN (SELECT ...) 

Поскольку выберите возвращает несколько значений, используя равно не будет работать, но IN возвращает истину, если любое из значений в матче списка. Список может быть жестко запрограммированным CSV-списком или выбрать один столбец, подобный вашему запросу.

Это исправление ошибки, но вы также должны удалить BOOK_TRANSACTIONS из списка таблиц и удалить BOOK_CODE из списка выбора.

После внесения этих изменений, ваш запрос будет выглядеть следующим образом:

SELECT SM.STAFF_CODE,SM.STAFF_NAME,DM.DEPT_NAME 
FROM STAFF_MASTER SM,DEPARTMENT_MASTER DM 
WHERE SM.DEPT_CODE =DM.DEPT_CODE 
AND SM.STAFF_CODE IN (
    SELECT STAFF_CODE 
    FROM BOOK_TRANSACTIONS 
    HAVING COUNT(*) > 1 
    GROUP BY STAFF_CODE) 

Я рекомендую обучение современным (в настоящее время более 25 лет) JOIN синтаксис.

Смежные вопросы