我在 oracle Sql Developer 中的这个相关查询中做错了什么
What I am doing wrong in this correlation query in oracle SqlDevelopper
我正在尝试构建一个查询 select 相关系数以确定用户评价最高的电影
我的table的结构是这样的:
我的查询是这样的:
SELECT
user1, user2,
((psum - (sum1 * sum2 / n)) / sqrt((sum1sq - pow(sum1, 2.0) / n) * (sum2sq - pow(sum2, 2.0) / n))) AS r,
n
FROM
(SELECT
n1.idclient AS user1,
n2.idclient AS user2,
SUM(n1.cote) AS sum1,
SUM(n2.cote) AS sum2,
SUM(n1.cote * n1.cote) AS sum1sq,
SUM(n2.cote * n2.cote) AS sum2sq,
SUM(n1.cote * n2.cote) AS psum,
COUNT(*) AS n
FROM
cote AS n1 // <---------- Editor is pointing a missing parenthese here with a red line
LEFT JOIN
cote AS n2 ON n1.idfilm = n2.idfilm
WHERE
n1.idclient > n2.idclient
GROUP BY
n1.idclient, n2.idclient) AS step1
ORDER BY
r DESC, n DESC
但是我确信我没有漏掉一个括号,我做错了什么?
P.S : 我不是专家,想了解一下
Oracle 不允许您将 AS
用于 table 别名,只能用于列别名。 The select-list syntax shows an optional AS
; the table-reference syntax 没有。
在您突出显示的行中
FROM cote AS n1
AS
被视为 table 别名(尽管它是一个保留字,因此您不能将其用作别名);然后它看到 n1
并且不知道它是什么意思。解析器似乎经常退回到猜测任何左括号应该已经关闭,在这种情况下紧接在 n1
标记之前,因为它可能已经完成了到目前为止解析的内容(我非常简化,当然);因此不是完全有用的错误消息。
所以您需要从所有三个使用它的地方删除 AS
:
SELECT
user1, user2,
((psum - (sum1 * sum2 / n)) / sqrt((sum1sq - pow(sum1, 2.0) / n) * (sum2sq - pow(sum2, 2.0) / n))) AS r,
n
FROM
(SELECT
n1.idclient AS user1,
n2.idclient AS user2,
SUM(n1.cote) AS sum1,
SUM(n2.cote) AS sum2,
SUM(n1.cote * n1.cote) AS sum1sq,
SUM(n2.cote * n2.cote) AS sum2sq,
SUM(n1.cote * n2.cote) AS psum,
COUNT(*) AS n
FROM
cote n1
LEFT JOIN
cote n2
ON
n1.idfilm = n2.idfilm
WHERE
n1.idclient > n2.idclient
GROUP BY
n1.idclient, n2.idclient) step1
ORDER BY
r DESC,
n DESC
我正在尝试构建一个查询 select 相关系数以确定用户评价最高的电影
我的table的结构是这样的:
我的查询是这样的:
SELECT
user1, user2,
((psum - (sum1 * sum2 / n)) / sqrt((sum1sq - pow(sum1, 2.0) / n) * (sum2sq - pow(sum2, 2.0) / n))) AS r,
n
FROM
(SELECT
n1.idclient AS user1,
n2.idclient AS user2,
SUM(n1.cote) AS sum1,
SUM(n2.cote) AS sum2,
SUM(n1.cote * n1.cote) AS sum1sq,
SUM(n2.cote * n2.cote) AS sum2sq,
SUM(n1.cote * n2.cote) AS psum,
COUNT(*) AS n
FROM
cote AS n1 // <---------- Editor is pointing a missing parenthese here with a red line
LEFT JOIN
cote AS n2 ON n1.idfilm = n2.idfilm
WHERE
n1.idclient > n2.idclient
GROUP BY
n1.idclient, n2.idclient) AS step1
ORDER BY
r DESC, n DESC
但是我确信我没有漏掉一个括号,我做错了什么?
P.S : 我不是专家,想了解一下
Oracle 不允许您将 AS
用于 table 别名,只能用于列别名。 The select-list syntax shows an optional AS
; the table-reference syntax 没有。
在您突出显示的行中
FROM cote AS n1
AS
被视为 table 别名(尽管它是一个保留字,因此您不能将其用作别名);然后它看到 n1
并且不知道它是什么意思。解析器似乎经常退回到猜测任何左括号应该已经关闭,在这种情况下紧接在 n1
标记之前,因为它可能已经完成了到目前为止解析的内容(我非常简化,当然);因此不是完全有用的错误消息。
所以您需要从所有三个使用它的地方删除 AS
:
SELECT
user1, user2,
((psum - (sum1 * sum2 / n)) / sqrt((sum1sq - pow(sum1, 2.0) / n) * (sum2sq - pow(sum2, 2.0) / n))) AS r,
n
FROM
(SELECT
n1.idclient AS user1,
n2.idclient AS user2,
SUM(n1.cote) AS sum1,
SUM(n2.cote) AS sum2,
SUM(n1.cote * n1.cote) AS sum1sq,
SUM(n2.cote * n2.cote) AS sum2sq,
SUM(n1.cote * n2.cote) AS psum,
COUNT(*) AS n
FROM
cote n1
LEFT JOIN
cote n2
ON
n1.idfilm = n2.idfilm
WHERE
n1.idclient > n2.idclient
GROUP BY
n1.idclient, n2.idclient) step1
ORDER BY
r DESC,
n DESC