在嵌套选择查询中按条件分组后加入
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
赋予别名(dip
或dip1
)。 (别名的范围仅在子查询内)
无论如何,更好的解决方案是使用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
干杯!!
【讨论】:
以上是关于在嵌套选择查询中按条件分组后加入的主要内容,如果未能解决你的问题,请参考以下文章