多表条件插入中何时需要别名?

问题描述

| 我的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