Sql 子查询不工作 "ORA-00904: "A2"."ID_USER": 无效标识符"
Sql Subquery Not working "ORA-00904: "A2"."ID_USER": invalid identifier"
我正在尝试 运行 在 Oracle 中进行此查询
SELECT A1.ID_USER,A1.CNAME,
(SELECT CNAME
FROM
(SELECT CNAME,COUNTER
FROM
(SELECT id_Category AS IDCATEGORT,COUNT(*) AS COUNTER
FROM gamescateg
WHERE id_game IN
(SELECT ID_GAME
FROM UserGames
WHERE id_user=UsersGamers.ID_USER
)
GROUP BY id_Category
)
JOIN Categories
ON id_Category =IDCATEGORT
ORDER BY COUNTER DESC
)
WHERE rownum = 1
) AS FAVORITECATEGORY
FROM UsersGamers A1
JOIN UsersGamers A2 ON A1.ID_USER= A2.ID_USER
但我收到错误
ORA-00904: "A2"."ID_USER": invalid identifier
A2.ID_USER 需要做子查询
为什么 ?
如何解决?
你可以帮帮我吗?
我通过创建函数来解决它
CREATE OR REPLACE FUNCTION FAVORITECATEGORYfunc( idnumber NUMBER )
RETURN VARCHAR2
IS
l_conc_names VARCHAR2(32676);
BEGIN
SELECT CNAME INTO l_conc_names
FROM
(SELECT CNAME,COUNTER
FROM
(SELECT id_Category AS IDCATEGORT,COUNT(*) AS COUNTER
FROM gamescateg
WHERE id_game IN
(SELECT ID_GAME
FROM UserGames
WHERE id_user=idnumber
)
GROUP BY id_Category
)
JOIN Categories
ON id_Category =IDCATEGORT
ORDER BY COUNTER DESC
)
WHERE rownum = 1;
RETURN l_conc_names;
END;
查询是
select CNAME,FAVORITECATEGORYfunc(id_user) from usersgamers
感谢您的帮助:)
我扩展了您的查询以使其更具可读性,并对问题(无效标识符)进行了评论。有对别名 A2 的引用,但 A2 不能是。
select A1.ID_USER, A1.CNAME,
(
SELECT CNAME FROM
(
SELECT CNAME, COUNTER
FROM
(
SELECT id_Category AS IDCATEGORT,
COUNT(*) AS COUNTER
FROM gamescateg
WHERE id_game IN
(
SELECT ID_GAME FROM UserGames
WHERE id_user=A2.ID_USER /* your problem is here */
)
GROUP BY id_Category
)
JOIN Categories
ON id_Category =IDCATEGORT
ORDER BY COUNTER DESC
)
WHERE rownum = 1
) AS FAVORITECATEGORY
FROM UsersGamers A1
JOIN UsersGamers A2
ON A1.ID_USER= A2.ID_USER
您是否考虑过重写此代码以避免出现如此多的嵌套查询?不要将它们一个一个地包裹起来,而是尝试使用连接围绕最喜欢的类别构建它。
试着这样写,确保你得到了想要的结果。
SELECT A1.ID_USER,
A1.CNAME,
(SELECT CNAME
FROM
(SELECT CNAME,
COUNTER
FROM
(SELECT id_Category AS IDCATEGORT,
COUNT(*) AS COUNTER
FROM gamescateg
WHERE id_game IN
(SELECT ID_GAME
FROM UserGames
WHERE id_user=UsersGamers.ID_USER --replaced A2 with UsersGamers
)
GROUP BY id_Category
)
JOIN Categories ON id_Category =IDCATEGORT
ORDER BY COUNTER DESC
)
WHERE rownum = 1
) AS FAVORITECATEGORY
FROM UsersGamers A1
JOIN UsersGamers A2 ON A1.ID_USER= A2.ID_USER
本质上,表面修复不会修复查询。所以,请解释你想做什么。我怀疑查询比需要的复杂得多。而且,很难破译。
从表面上看,您的问题是您使用的是 table 名称而不是别名。因此,有人会认为像这样编写查询可以解决问题:
SELECT A1.ID_USER, A1.CNAME,
(SELECT CNAME
FROM (SELECT CNAME, COUNTER
FROM (SELECT id_Category AS IDCATEGORT, COUNT(*) AS COUNTER
FROM gamescateg
WHERE id_game IN (SELECT ug.ID_GAME
FROM UserGames ug
WHERE ug.id_user = UsersGamers.ID_USER
)
GROUP BY id_Category
) cc JOIN
Categories c
ON c.id_Category = cc.IDCATEGORT
ORDER BY COUNTER DESC
)
WHERE rownum = 1
) AS FAVORITECATEGORY
FROM UsersGamers A1 JOIN
UsersGamers A2
ON A1.ID_USER = A2.ID_USER;
但是,唉,它不会。 Oracle 限制相关子查询的范围深度。所以,这并不能解决问题;你只会得到另一个错误。
此类查询可能做的最合理的事情是获取给定用户最常见的类别。如果是:
SELECT u.*
FROM (SELECT ugr.ID_USER, ugr.CNAME, c.cname, COUNT(*) as cnt,
ROW_NUMBER() OVER (PARTITION BY ugr.ID_USER, ugr.CNAME
ORDER BY COUNT(*) DESC
) as seqnum
FROM UsersGamers ugr JOIN
UserGames ug
ON ugr.ID_USER = ug.ID_USER JOIN
Categories c
ON c.id_Category = ug.id_Category
GROUP BY ugr.ID_USER, ugr.CNAME
) u
WHERE seqnum = 1;
我正在尝试 运行 在 Oracle 中进行此查询
SELECT A1.ID_USER,A1.CNAME,
(SELECT CNAME
FROM
(SELECT CNAME,COUNTER
FROM
(SELECT id_Category AS IDCATEGORT,COUNT(*) AS COUNTER
FROM gamescateg
WHERE id_game IN
(SELECT ID_GAME
FROM UserGames
WHERE id_user=UsersGamers.ID_USER
)
GROUP BY id_Category
)
JOIN Categories
ON id_Category =IDCATEGORT
ORDER BY COUNTER DESC
)
WHERE rownum = 1
) AS FAVORITECATEGORY
FROM UsersGamers A1
JOIN UsersGamers A2 ON A1.ID_USER= A2.ID_USER
但我收到错误
ORA-00904: "A2"."ID_USER": invalid identifier
A2.ID_USER 需要做子查询 为什么 ? 如何解决? 你可以帮帮我吗?
我通过创建函数来解决它
CREATE OR REPLACE FUNCTION FAVORITECATEGORYfunc( idnumber NUMBER )
RETURN VARCHAR2
IS
l_conc_names VARCHAR2(32676);
BEGIN
SELECT CNAME INTO l_conc_names
FROM
(SELECT CNAME,COUNTER
FROM
(SELECT id_Category AS IDCATEGORT,COUNT(*) AS COUNTER
FROM gamescateg
WHERE id_game IN
(SELECT ID_GAME
FROM UserGames
WHERE id_user=idnumber
)
GROUP BY id_Category
)
JOIN Categories
ON id_Category =IDCATEGORT
ORDER BY COUNTER DESC
)
WHERE rownum = 1;
RETURN l_conc_names;
END;
查询是
select CNAME,FAVORITECATEGORYfunc(id_user) from usersgamers
感谢您的帮助:)
我扩展了您的查询以使其更具可读性,并对问题(无效标识符)进行了评论。有对别名 A2 的引用,但 A2 不能是。
select A1.ID_USER, A1.CNAME,
(
SELECT CNAME FROM
(
SELECT CNAME, COUNTER
FROM
(
SELECT id_Category AS IDCATEGORT,
COUNT(*) AS COUNTER
FROM gamescateg
WHERE id_game IN
(
SELECT ID_GAME FROM UserGames
WHERE id_user=A2.ID_USER /* your problem is here */
)
GROUP BY id_Category
)
JOIN Categories
ON id_Category =IDCATEGORT
ORDER BY COUNTER DESC
)
WHERE rownum = 1
) AS FAVORITECATEGORY
FROM UsersGamers A1
JOIN UsersGamers A2
ON A1.ID_USER= A2.ID_USER
您是否考虑过重写此代码以避免出现如此多的嵌套查询?不要将它们一个一个地包裹起来,而是尝试使用连接围绕最喜欢的类别构建它。
试着这样写,确保你得到了想要的结果。
SELECT A1.ID_USER,
A1.CNAME,
(SELECT CNAME
FROM
(SELECT CNAME,
COUNTER
FROM
(SELECT id_Category AS IDCATEGORT,
COUNT(*) AS COUNTER
FROM gamescateg
WHERE id_game IN
(SELECT ID_GAME
FROM UserGames
WHERE id_user=UsersGamers.ID_USER --replaced A2 with UsersGamers
)
GROUP BY id_Category
)
JOIN Categories ON id_Category =IDCATEGORT
ORDER BY COUNTER DESC
)
WHERE rownum = 1
) AS FAVORITECATEGORY
FROM UsersGamers A1
JOIN UsersGamers A2 ON A1.ID_USER= A2.ID_USER
本质上,表面修复不会修复查询。所以,请解释你想做什么。我怀疑查询比需要的复杂得多。而且,很难破译。
从表面上看,您的问题是您使用的是 table 名称而不是别名。因此,有人会认为像这样编写查询可以解决问题:
SELECT A1.ID_USER, A1.CNAME,
(SELECT CNAME
FROM (SELECT CNAME, COUNTER
FROM (SELECT id_Category AS IDCATEGORT, COUNT(*) AS COUNTER
FROM gamescateg
WHERE id_game IN (SELECT ug.ID_GAME
FROM UserGames ug
WHERE ug.id_user = UsersGamers.ID_USER
)
GROUP BY id_Category
) cc JOIN
Categories c
ON c.id_Category = cc.IDCATEGORT
ORDER BY COUNTER DESC
)
WHERE rownum = 1
) AS FAVORITECATEGORY
FROM UsersGamers A1 JOIN
UsersGamers A2
ON A1.ID_USER = A2.ID_USER;
但是,唉,它不会。 Oracle 限制相关子查询的范围深度。所以,这并不能解决问题;你只会得到另一个错误。
此类查询可能做的最合理的事情是获取给定用户最常见的类别。如果是:
SELECT u.*
FROM (SELECT ugr.ID_USER, ugr.CNAME, c.cname, COUNT(*) as cnt,
ROW_NUMBER() OVER (PARTITION BY ugr.ID_USER, ugr.CNAME
ORDER BY COUNT(*) DESC
) as seqnum
FROM UsersGamers ugr JOIN
UserGames ug
ON ugr.ID_USER = ug.ID_USER JOIN
Categories c
ON c.id_Category = ug.id_Category
GROUP BY ugr.ID_USER, ugr.CNAME
) u
WHERE seqnum = 1;