繁体   English   中英

SQL子查询缺少表达式

[英]SQL missing expression on subquery

SELECT IME_ODDAJE
from ODDAJA
inner join (
  SELECT FK_ODDAJA2, COUNT(*) AS ST_GOSTOV
  FROM ODDAJA_GOST
  HAVING ST_GOSTOV > AVG(SELECT FK_ODDAJA2, COUNT(*) AS ST_GOSTOV FROM ODDAJA_GOST GROUP BY FK_ODDAJA2) t ON t.fk_oddaja2 = oddaja.ID_ODDAJA 
GROUP BY FK_ODDAJA2
);

**AVG(SELECT** FK_ODDAJA2, COUNT(*) AS ST_GOSTOV FROM ODDAJA_GOST GROUP BY FK_ODDAJA2)

在这个大胆的部分中,甲骨文给我抛出了一个例外,那就是缺少表达,如果有人可以帮助我,我将很高兴。

在这里,我需要统计节目中的来宾人数,并且需要挑选出比节目中的平均来宾人数更多的来宾。

正确的语法是将聚合函数应用于选定的列,而不是整个查询:

   Select avg(fk_oddaja2)
        , count(*)         As st_gostov
     From oddaja_gost
 Group by fk_oddaja2
        ;

我建议一个迭代查询开发过程。 从获得所需结果一部分的查询开始,进行测试,并验证它是否返回我们期望的结果。 然后添加查询的下一部分,并进行测试。 当我们遇到麻烦时,请备份到我们曾经工作过的地方。

从一个查询开始,该查询获取每个节目的来宾人数:

 SELECT g.fk_oddaja2
      , COUNT(*) AS st_gostov
   FROM oddaja_gost g
  GROUP BY g.fk_oddaja2

接下来,我们编写一个查询,获取每个节目的平均来宾人数

 SELECT AVG(c.st_gostov) AS avg_st_gostov 
   FROM (
         SELECT g.fk_oddaja2
              , COUNT(*) AS st_gostov
           FROM oddaja_gost g
          GROUP BY g.fk_oddaja2
        ) c

或者,我们可以通过将客人总数除以表演次数来获得总体平均值:

 SELECT COUNT(t.fk_oddaja2) / COUNT(DISTINCT t.fk_oddaja2) AS avg_guests 
   FROM oddaja_gost t

接下来,我们可以将上述查询用作内联视图,以类似的模式将两个查询组合起来(以返回大于平均值的计数):

SELECT ...
  FROM ( SELECT ... 
       ) a
  JOIN ( SELECT ... 
       ) c
    ON c.st_gostov > a.avg_st_gostov

或者,我们可以使用通用表表达式将它们组合起来:

 WITH c AS ( SELECT g.fk_oddaja2
                  , COUNT(*) AS st_gostov
               FROM oddaja_gost g
              GROUP BY g.fk_oddaja2
           )
      a AS ( SELECT AVG(ac.st_gostov) AS avg_st_gostov
               FROM c ac
           )  
 SELECT a.avg_st_gostov
      , c.st_gostov
      , c.fk_oddaja2
   FROM c
   JOIN a
     ON c.st_gostov > a.avg_st_gostov
  ORDER BY c.st_gostov DESC

接下来,我们可以考虑将联接添加到ODDAJA表中。 (似乎原始查询缺少要“匹配”来自ODDAJA的行的条件。)我们可以冒险猜测该条件应该是...也许ODDAJA_GOST的FK_ODDAJA2应该与ODDAJA的ODDAJA2相匹配?

 WITH c AS ( SELECT g.fk_oddaja2
                  , COUNT(*) AS st_gostov
               FROM oddaja_gost g
              GROUP BY g.fk_oddaja2
           )
      a AS ( SELECT AVG(ac.st_gostov) AS avg_st_gostov
               FROM c ac
           )  
 SELECT o.ime_oddaje
      , a.avg_st_gostov
      , c.st_gostov
      , c.fk_oddaja2 
   FROM c
   JOIN a
     ON c.st_gostov > a.avg_st_gostov
   JOIN oddaja o
     ON o.oddaja2 = c.fk_oddaja2
  ORDER BY c.st_gostov DESC 

这就是我要采取的方法:逐步地逐步构建查询,而每一步都基于上一步。

拥有一些示例数据预期输出会很有帮助,因此我们可以测试每个步骤,并可以将结果进行比较。


或者,我们可以尝试修复原始查询中的语法。 这可能会解决语法错误。 (这也可能不会返回满足规范的结果。)

SELECT IME_ODDAJE from ODDAJA inner join (SELECT FK_ODDAJA2, COUNT(*) AS ST_GOSTOV FROM ODDAJA_GOST GROUP BY FK_ODDAJA2 HAVING ST_GOSTOV > (SELECT AVG(ST_GOSTOV) FROM (SELECT FK_ODDAJA2, COUNT(*) AS ST_GOSTOV FROM ODDAJA_GOST GROUP BY FK_ODDAJA2))) ON FK_ODAJA2 = ODDAJA2 

任何。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM