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

Posted

技术标签:

【中文标题】多表条件插入何时需要别名?【英文标题】:When are aliases needed in a multi-table conditional insert? 【发布时间】:2011-05-24 23:00:22 【问题描述】:

我的 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 行引用列别名。

我的困惑来源:

我们是否也需要在第 7 行和第 8 行中选择的两个 MAX_SALARY 列上的别名,以便在第 4 行中区分它们?解释似乎表明 EMPLOYEE_SALARY 和 BOSS_SALARY 别名是无关的......

有人可以澄清一下吗?

【问题讨论】:

【参考方案1】:

我猜他们的意思是他们只需要在两列(例如 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

【讨论】:

这是有道理的,也是我所期望的。所以你说这只是一个大错别字? 是的,我就是这么想的,其他对我来说没有任何意义。

以上是关于多表条件插入何时需要别名?的主要内容,如果未能解决你的问题,请参考以下文章

java实现多表的自定义查询。

01-多表查询

连接查询

Oracle 多表查询

Oracle多表查询与数据更新

MySQL语法------15-----DML语言-增删改