错误“单行子查询返回多行”意味着什么以及如何修复它?

ev7lccsx  于 2022-09-18  发布在  Java
关注(0)|答案(2)|浏览(322)

我正在尝试查询得分高于随机选择的电影分数的所有电影。我不明白修复我的查询的错误。

  • 列出评分高于数据库中某些电影的电影片名。

(不要将“某些”电影硬编码为任何特定电影,如“泰坦尼克号”。)*

SELECT TITLE FROM MOVIE
WHERE SCORE > (SELECT SCORE FROM MOVIE);
vc9ivgsu

vc9ivgsu1#

正如@Halim Saad-Rached在他们的回答中提到的那样,SELECT SCORE FROM MOVIE返回多行,然后您尝试将外部查询中的每一行与内部查询中的多行进行比较。
我正在尝试查询得分高于随机选择的电影分数的所有电影。

你需要找到一部随机的电影,而不是所有的电影。

在Oracle 12中,您可以使用:

SELECT TITLE
FROM   MOVIE
WHERE  SCORE > (SELECT SCORE
                FROM   MOVIE
                ORDER BY DBMS_RANDOM.VALUE()
                FETCH FIRST ROW ONLY
               );

或者,在早期版本中:

SELECT TITLE
FROM   MOVIE
WHERE  SCORE > (SELECT score
                FROM   (
                  SELECT SCORE
                  FROM   MOVIE
                  ORDER BY DBMS_RANDOM.VALUE()
                )
                WHERE  ROWNUM = 1
               );

或者,使用分析函数仅查询表一次:

SELECT title
FROM   (
  SELECT title,
         score,
         MIN(score)
           KEEP (DENSE_RANK FIRST ORDER BY DBMS_RANDOM.VALUE(), ROWNUM)
           OVER ()
           AS random_score
  FROM   MOVIE
)
WHERE  score > random_score;
omjgkv6w

omjgkv6w2#

子查询SELECT SCORE FROM MOVIE不返回电影的随机分数,换句话说,不是标量,而是分数列表。不能将>左侧的标量与其右侧的列表(子查询的结果)进行比较。这在句法上是错误的。您可以通过许多不同的方式来纠正这一点。这取决于你想要什么。以下是使用>运算符的一些工作示例:

SELECT TITLE FROM MOVIE
WHERE SCORE > (SELECT MAX(SCORE) FROM MOVIE)
SELECT TITLE FROM MOVIE
WHERE SCORE > (SELECT MIN(SCORE) FROM MOVIE)
SELECT TITLE FROM MOVIE
WHERE SCORE > ALL (SELECT SCORE FROM MOVIE)
SELECT TITLE FROM MOVIE
WHERE SCORE > ANY (SELECT SCORE FROM MOVIE)

相关问题