问题描述
|
我的Oracle SQL认证专家考试学习指南中的一个示例让我感到困惑。
SQL语句:
INSERT
WHEN (BOSS_SALARY-EMPLOYEE_SALARY < 10000) THEN
INTO SALARY_CHART (EMP_TITLE,SUPERIOR,EMP_INCOME,SUP_INCOME)
VALUES (EMPLOYEE,BOSS,EMPLOYEE_SALARY,BOSS_SALARY)
SELECT A.POSITION EMPLOYEE,B.POSITION BOSS,A.MAX_SALARY EMPLOYEE_SALARY,B.MAX_SALARY BOSS_SALARY
FROM POSITIONS A
JOIN POSITIONS B ON A.REPORTS_TO_POSITION_ID = B.POSITION_ID
书中的解释:
请注意,此版本已完成更多操作
超过要求,并应用列
别名为
子查询,然后引用这些列
来自WHEN和VALUES的别名
条款。我们只需要专栏
A.POSITION和B.POSITION的别名
在第5和6行中,因此我们可以在第4行中引用列别名。
我的困惑来源:
为了在第4行中区分它们,我们是否也不需要在第7和8行中选择的两个MAX_SALARY列上的别名?解释似乎表明EMPLOYEE_SALARY和BOSS_SALARY别名是多余的...
有人可以澄清一下吗?
解决方法
我猜他们意味着他们只需要在两列(例如A.POSITION和A.MAX_SALARY)上为解析器消除歧义。例如,这将起作用:
INSERT
WHEN (MAX_SALARY-EMPLOYEE_SALARY < 10000) THEN
INTO SALARY_CHART (EMP_TITLE,SUPERIOR,EMP_INCOME,SUP_INCOME)
VALUES (EMPLOYEE,POSITION,EMPLOYEE_SALARY,MAX_SALARY)
SELECT A.POSITION EMPLOYEE,B.POSITION,A.MAX_SALARY EMPLOYEE_SALARY,B.MAX_SALARY
FROM POSITIONS A
JOIN POSITIONS B ON A.REPORTS_TO_POSITION_ID = B.POSITION_ID