2016-02-13 88 views
1

我試圖在甲骨文的Sql子查詢不工作 「ORA-00904: 」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 
     ) 
     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需要做子查詢 爲什麼? 如何解決? 你能幫助我嗎?

我解決它BY CREATE FUNCTION

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 

感謝幫助:)

+1

您將'UsersGamers'加入自己使用同一列'ID_USER',爲什麼? – dnoeth

+0

編輯你的問題並解釋你正在嘗試做什麼。我懷疑查詢的方式比它需要的複雜。 –

回答

0

我已經擴大您的查詢,使其更具可讀性並評論了問題(無效標識符)。有一個引用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 

你有沒有考慮重寫這個以避免這麼多的嵌套查詢?而不是將它們一個包裝到另一箇中,而是嘗試使用連接對最喜歡的類別進行構造。

+0

謝謝,我改變了它 –

0

試着像這樣寫,並確保你得到了期望的結果。

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 
+0

不工作,但謝謝 –

1

實質上,膚淺的修復不會修復查詢。所以,請解釋你正在嘗試做什麼。我懷疑查詢比需要的複雜得多。而且,這很難破譯。

從表面上看,您的問題是您使用的是表名而不是別名。所以,有人會認爲寫這樣的查詢將解決問題:

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; 
+0

感謝您的幫助 –