2016-08-21 59 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 ...) 

因为select返回多个值,使用等于将无法正常工作,但IN返回true,如果任何一个列表的匹配值的。该列表可以是硬编码的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语法。