我正在尝试为那些已经拿过一本书的人显示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)
它给出错误:
单行子查询返回多行。
如何解决这个问题?
答案 0 :(得分:1)
将=
更改为IN
:
WHERE SM.STAFF_CODE IN (SELECT ...)
因为select返回多个值,所以使用equals将不起作用,但如果列表中的任何值匹配,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语法。