[英]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.