pl/sql select子查询的标识符无效-can';t在“中使用新的子查询”;其中;

pl/sql select子查询的标识符无效-can';t在“中使用新的子查询”;其中;,select,plsql,subquery,Select,Plsql,Subquery,我不明白为什么我可以按新的子查询排序,但同时不能用where查询它,就好像我没有定义注释一样 SELECT USERNAME, (SELECT COUNT(C_KEY) AS COMMENT_COUNT FROM COMMENTS coms WHERE coms.U_KEY = usrs.U_KEY) AS COMMENT_COUNTED FROM USERS usrs WHERE COMMENT_COUNTED >= 3 ORDER by COMMENT_COUNTED

我不明白为什么我可以按新的子查询
排序,但同时不能用
where
查询它,就好像我没有定义
注释一样

SELECT USERNAME,
  (SELECT COUNT(C_KEY) AS COMMENT_COUNT
   FROM COMMENTS coms
   WHERE coms.U_KEY = usrs.U_KEY) AS COMMENT_COUNTED
FROM USERS usrs 
WHERE COMMENT_COUNTED >= 3
ORDER by COMMENT_COUNTED desc;
我还尝试了注释计数的地方。注释计数>=3

我的错误消息:

ORA-00904: "COMMENT_COUNTED"."COMMENT_COUNT": invalid identifier
编辑:我有一个糟糕的“解决方案”。它确实有效,但我真的想找到另一种方法。我可以将相同的子查询放在
的WHERE
中,然后比较它是否>=3,如下所示:

SELECT USERNAME,
  (SELECT COUNT(C_KEY) AS COMMENT_COUNT
   FROM COMMENTS coms
   WHERE coms.U_KEY = usrs.U_KEY) AS COMMENT_COUNTED
FROM USERS usrs 
WHERE (SELECT COUNT(C_KEY) AS COMMENT_COUNT
   FROM COMMENTS coms
   WHERE coms.U_KEY = usrs.U_KEY) >= 3
ORDER by COMMENT_COUNTED desc;
SELECT USERNAME,
       (SELECT COUNT(C_KEY) AS COMMENT_COUNT
        FROM COMMENTS coms
        WHERE coms.U_KEY = usrs.U_KEY) AS COMMENT_COUNTED
FROM USERS usrs 
WHERE COMMENT_COUNTED >= 3
ORDER by 2 desc;
这样做:

要么:

with tbl as(SELECT C_KEY AS COMMENT_COUNT
            FROM COMMENTS  )                       
 SELECT USERNAME,count(coms.COMMENT_COUNT)        
    FROM USERS usrs
    join tbl coms
    on coms.U_KEY = usrs.U_KEY
   WHERE coms.COMMENT_COUNT >= 3
ORDER BY coms.COMMENT_COUNT DESC;
或:


对于“按新子查询排序”查询,您可以按以下列的编号排序:

SELECT USERNAME,
  (SELECT COUNT(C_KEY) AS COMMENT_COUNT
   FROM COMMENTS coms
   WHERE coms.U_KEY = usrs.U_KEY) AS COMMENT_COUNTED
FROM USERS usrs 
WHERE (SELECT COUNT(C_KEY) AS COMMENT_COUNT
   FROM COMMENTS coms
   WHERE coms.U_KEY = usrs.U_KEY) >= 3
ORDER by COMMENT_COUNTED desc;
SELECT USERNAME,
       (SELECT COUNT(C_KEY) AS COMMENT_COUNT
        FROM COMMENTS coms
        WHERE coms.U_KEY = usrs.U_KEY) AS COMMENT_COUNTED
FROM USERS usrs 
WHERE COMMENT_COUNTED >= 3
ORDER by 2 desc;
如果需要将数据输入到中,则有三个选项:

I.在where子句中放置相同的子查询

SELECT USERNAME,
       (SELECT COUNT(C_KEY) AS COMMENT_COUNT
        FROM COMMENTS coms
        WHERE coms.U_KEY = usrs.U_KEY) AS COMMENT_COUNTED
FROM USERS usrs 
WHERE (SELECT COUNT(C_KEY) AS COMMENT_COUNT
       FROM COMMENTS coms
       WHERE coms.U_KEY = usrs.U_KEY) >= 3
ORDER by 2 desc;
二,。基于子查询进行查询:

SELECT USERNAME, COMMENT_COUNTED
FROM   (SELECT USERNAME,
               (SELECT COUNT(C_KEY) AS COMMENT_COUNT
                FROM COMMENTS COMS
                WHERE COMS.U_KEY = USRS.U_KEY) AS COMMENT_COUNTED
        FROM USERS  
       ) USRS
WHERE COMMENT_COUNTED >= 3       
ORDER BY COMMENT_COUNTED DESC;
使用此选项,可以在ORDERBY子句中使用列名

更新

三、 使用GROUPBY子句和聚合函数(这是一个更好、更干净的解决方案):


执行where子句后才会创建
注释。就查询的结构而言,SQL的执行流基本上是自下而上的,但我们自上而下地编写和解释它

其他答案提供了正确的查询,但从未解释您的尝试不起作用的原因

以下是另一种方法:

select * from (
    SELECT USERNAME,
      (
       SELECT COUNT(C_KEY) AS COMMENT_COUNT
       FROM COMMENTS coms
       WHERE coms.U_KEY = usrs.U_KEY
      ) AS COMMENT_COUNTED
    FROM USERS usrs
) as a
WHERE a.COMMENT_COUNTED >= 3
ORDER by a.COMMENT_COUNTED desc;