在嵌套选择查询中按条件分组后加入

Posted

技术标签:

【中文标题】在嵌套选择查询中按条件分组后加入【英文标题】:join after group by condition in a nested select query 【发布时间】:2020-02-20 08:39:13 【问题描述】:

您好,我是 sql 新手,我正在尝试解决此查询: 找出工资至少高于其部门平均工资 10% 的员工的注册号 (MATRICOLA) 和姓氏 (COGNOME)。

IMPIEGATO(employees)
DIPARTIMENTO(department)

SELECT *
from (
  SELECT *
  FROM IMPIEGATO imp1, 
       DIPARTIMENTO dip1
  where imp1.dipartimento_codice_fk = dip1.codice
), (
  SELECT dip.codice, 1.1*avg(imp.stipendio) AS "STIPENDIO_MEDIO_10"
  FROM IMPIEGATO imp
    JOIN DIPARTIMENTO dip ON dip.CODICE=imp.DIPARTIMENTO_CODICE_FK
  GROUP BY dip.codice
)

我不能添加这个 where 条件来获得我需要的结果WHERE dip.codice=dip1.codice。 这是我得到的错误

ORA-00904: "DIP1"."CODICE": identificativo 无效 00904. 00000 - “%s:无效标识符” *原因: *行动: Errore alla riga:255,结肠:18

【问题讨论】:

只有当我添加 where 条件时才会发生错误,我在加入时使用相同的点表示法调用了“CODICE”,顺便说一下,我也发布了 ddl 今日提示:始终使用现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读和维护,如果需要更容易转换为外连接! 【参考方案1】:

您在这两个子查询之外引用CODICE,并在子查询中为DIPARTIMENTO 赋予别名(dipdip1)。 (别名的范围仅在子查询内)

无论如何,更好的解决方案是使用analytical function,如下所示:

SELECT MATRICOLA, COGNOME
FROM
    ( SELECT
            EMP.MATRICOLA, EMP.COGNOME, EMP.STIPENDIO,
            AVG(EMP.STIPENDIO) OVER(
                PARTITION BY EMP.DIPARTIMENTO_CODICE_FK
            ) AS AVG_SALARY_DEPT
        FROM IMPIEGATO EMP
             JOIN DIPARTIMENTO DEPT ON EMP.DIPARTIMENTO_CODICE_FK = DEPT.CODICE
    )
WHERE STIPENDIO >= 1.1 * AVG_SALARY_DEPT;

您也可以使用自己的查询,只需稍加改动即可。以下查询的 cmets 中提到了更改:

SELECT t1.MATRICOLA, t1.COGNOME 
from (
  SELECT *
  FROM IMPIEGATO imp1, 
       DIPARTIMENTO dip1
  where imp1.dipartimento_codice_fk = dip1.codice
) t1 join -- given alias
(
  SELECT dip.codice, 1.1*avg(imp.stipendio) AS "STIPENDIO_MEDIO_10"
  FROM IMPIEGATO imp
    JOIN DIPARTIMENTO dip ON dip.CODICE=imp.DIPARTIMENTO_CODICE_FK
  GROUP BY dip.codice
) t2 on t1.codice = t2.codice -- given alias 
                              -- and added the join condition with proper alias(t1, t2)
where t1.stipendio >= t2.STIPENDIO_MEDIO_10 -- added the condition to fetch desired result

干杯!!

【讨论】:

以上是关于在嵌套选择查询中按条件分组后加入的主要内容,如果未能解决你的问题,请参考以下文章

在谷歌大查询中按未嵌套值分组时获取不同值的总和

如何在Postgresql中按嵌套数组的重复值分组?

Access查询中按不同列功能选择列

如何按范围分组,或有条件地从查询结果中选择

如何在javascript中按id嵌套数据过滤和分组?

在elasticsearch中,如何在嵌套数组中按值分组