正如@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;
2条答案
按热度按时间vc9ivgsu1#
正如@Halim Saad-Rached在他们的回答中提到的那样,
SELECT SCORE FROM MOVIE
返回多行,然后您尝试将外部查询中的每一行与内部查询中的多行进行比较。我正在尝试查询得分高于随机选择的电影分数的所有电影。
你需要找到一部随机的电影,而不是所有的电影。
在Oracle 12中,您可以使用:
或者,在早期版本中:
或者,使用分析函数仅查询表一次:
omjgkv6w2#
子查询
SELECT SCORE FROM MOVIE
不返回电影的随机分数,换句话说,不是标量,而是分数列表。不能将>左侧的标量与其右侧的列表(子查询的结果)进行比较。这在句法上是错误的。您可以通过许多不同的方式来纠正这一点。这取决于你想要什么。以下是使用>运算符的一些工作示例: