簡體   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