SQL交叉嵌套查询

SQL交叉嵌套查询,sql,oracle,Sql,Oracle,使用Oracle SQL,我试图写一个声明来回答以下问题:NFL球队赢得的比赛比他们所在分区的平均水平多,他们的罚球场也比分区的平均水平多 我有两个单独的语句可以分别返回(即:一个表列出了获胜次数超过分区平均数的球队,另一个表列出了点球码超过分区平均数的球队) 然而,当我尝试将这两个查询相交时,我遇到了错误。”缺少select关键字是给定的错误 WITH divisionPenaltyYards AS ( SELECT division ,avg(penaltyyard

使用Oracle SQL,我试图写一个声明来回答以下问题:NFL球队赢得的比赛比他们所在分区的平均水平多,他们的罚球场也比分区的平均水平多

我有两个单独的语句可以分别返回(即:一个表列出了获胜次数超过分区平均数的球队,另一个表列出了点球码超过分区平均数的球队)

然而,当我尝试将这两个查询相交时,我遇到了错误。”缺少select关键字是给定的错误

WITH divisionPenaltyYards AS 
(
    SELECT division
        ,avg(penaltyyards) AS AVGPenalty
    FROM nfl.teams
    GROUP BY division
)
WITH divisionWins AS 
(
        SELECT division
            ,avg(wins) AS AVGWins
        FROM nfl.teams
        GROUP BY division
)
SELECT team
FROM nfl.teams
INNER JOIN divisionPenaltyYards 
    ON nfl.teams.division = divisionPenaltyYards.division
WHERE penaltyyards > AVGPenalty

INTERSECT

SELECT team
FROM nfl.teams
INNER JOIN divisionWins 
    ON nfl.teams.division = divisionWins.division
WHERE wins > AVGWins;
编辑:每个请求的更多信息

NFL。球队由NFL中所有球队的统计数据组成。 球队,分区,胜利,惩罚

数据集的一个示例包括
Packers,NFC NORTH,6984
Steelers,AFC NORTH,12817
等等


理想的结果将是一个表格,列出所有获胜次数超过分区平均数的球队,同时罚球码数也超过分区平均数。

第二个CTE不应以
关键字开头。只需<代码>,即可作为

WITH divisionPenaltyYards AS 
(
    SELECT division
        ,avg(penaltyyards) AS AVGPenalty
    FROM nfl.teams
    GROUP BY division
)
, divisionWins AS 
(
        SELECT division
            ,avg(wins) AS AVGWins
        FROM nfl.teams
        GROUP BY division
)
SELECT team
FROM nfl.teams
INNER JOIN divisionPenaltyYards 
    ON nfl.teams.division = divisionPenaltyYards.division
WHERE penaltyyards > AVGPenalty

INTERSECT

SELECT team
FROM nfl.teams
INNER JOIN divisionWins 
    ON nfl.teams.division = divisionWins.division
WHERE wins > AVGWins;
这里也不需要使用两个CTE

WITH divisionCTE AS 
(
    SELECT division, 
        avg(penaltyyards) as avgpenalty, 
        avg(wins) as avgwins 
    FROM nfl.teams 
    GROUP BY division
)
SELECT team
FROM nfl.teams
INNER JOIN divisionCTE ON nfl.teams.division = divisionCTE.division
WHERE penaltyyards > AVGPenalty

INTERSECT

SELECT team
FROM nfl.teams
INNER JOIN divisionCTE ON nfl.teams.division = divisionCTE.division
WHERE wins > AVGWins; 
此外,INTERSECT在这里工作,但UNION更有意义。但归根结底,两者都不需要:

WITH divisionCTE AS 
(
    SELECT division, 
        avg(penaltyyards) as avgpenalty, 
        avg(wins) as avgwins 
    FROM nfl.teams 
    GROUP BY division
)
SELECT team
FROM nfl.teams
INNER JOIN divisionCTE ON nfl.teams.division = divisionCTE.division
WHERE penaltyyards > AVGPenalty
    AND wins > avgwins
最后,如果要避免连接,可以使用窗口函数:

SELECT team
FROM 
    (
        SELECT team, wins, penaltyyards,
            avg(penaltyyards) OVER (PARTITION BY division) as avgpenalty, 
            avg(wins) OVER (PARTITION BY division) as avgwins 
        FROM nfl.teams 
    ) averages
WHERE penaltyyards > AVGPenalty AND wins > avgwins

样本数据和期望的结果将真正帮助其他人了解您正在尝试做什么。您能从您的表格中提供一些样本数据吗?回答得很好,我感谢您的输入。任何能让它以更少的代码工作的东西都是很棒的。1小提示,您在重命名CTE时忘记将join语句中的
DivisionWins
名称更改为
divisionCTE
。否则,这一切都会完美无瑕。啊!我当然知道。我已经修复了这个问题,并增加了一个使用窗口函数执行平均值的选项,这样就可以避免连接。不确定它是否会更快,因为我打赌您的数据相对较小,但它确实是一个很好的简洁查询