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;