首页 文章

该查询使单行查询返回多行

提问于
浏览
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)

它给出了错误:

单行子查询返回多行 .

怎么解决这个?

1 回答

  • 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语法 .

相关问题