EMPLOYEE_ID LAST_NAME LOCATION_ID DEPARTMENT_ID ----------- ------------------------- ----------- ------------- 200 Whalen 1700 10 201 Hartstein 1800 20 ... 106 rows selected. 在示例中,由于EMPLOYEES表和DEPARTMENTS表中的DEPARTMENT_ID列已联接起来,因此会显示雇员所在部门的LOCATION_ID。 在USING子句中使用表别名 hr@TEST0924> SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE d.location_id = 1400; SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE d.location_id = 1400 * ERROR at line 1: ORA-25154: column part of USING clause cannot have qualifier
不要对USING子句中使用的列加以限定。 如果在SQL 语句的另一个位置使用了同一列,则不要对其设置别名。
使用USING子句进行联接时,不能对USING子句自身中使用的列加以限定。此外,如果在SQL 语句的任何位置使用了该列,则不能对其设置别名。例如,在示例提及的查询中,不能对WHERE子句中的location_id列设置别名,因为在USING子句中已使用该列。 USING子句中引用的那些列不能在SQL 语句的任何位置使用限定词(表名或别名)。 例如,下面的语句是有效的: hr@TEST0924> SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE location_id = 1400; CITY DEPARTMENT_NAME ------------------------------ ------------------------------ Southlake IT 这两个表中通用但未在USING子句中使用的列必须以表别名为前缀,否则会出现“column ambiguously defined(定义的列含糊不清)”错误。 在下面的语句中,manager_id既在employees表中又在departments表中,如果manager_id不以表别名为前缀,则会收到“column ambiguously defined(定义的列含糊不清)”错误。 下面的语句是有效的: hr@TEST0924> SELECT first_name, d.department_name, d.manager_id FROM employees e JOIN departments d USING (department_id) WHERE department_id = 50;
FIRST_NAME DEPARTMENT_NAME MANAGER_ID -------------------- ------------------------------ ---------- Donald Shipping 121 Douglas Shipping 121 ... 45 rows selected. 使用ON子句创建联接 自然联接的基本联接条件是对具有相同名称的所有列进行等值联接。 使用ON子句可指定任意条件或指定要联接的列。 联接条件独立于其它搜索条件。 使用ON子句可使代码易于理解。 使用ON子句可指定联接条件。这样,便可以在WHERE子句中指定独立于任何搜索条件或过滤条件的联接条件。 使用ON子句检索记录 hr@TEST0924> SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id 2 FROM employees e JOIN departments d ON (e.department_id = d.department_id);
EMPLOYEE_ID LAST_NAME DEPARTMENT_ID DEPARTMENT_ID LOCATION_ID ----------- ------------------------- ------------- ------------- ----------- 200 Whalen 10 10 1700 201 Hartstein 20 20 1800 ... 106 rows selected.
在此示例中,EMPLOYEES表和DEPARTMENTS表中的DEPARTMENT_ID列已使用ON子句联接起来。只要EMPLOYEES表中的部门ID 等于DEPARTMENTS表中的部门ID,就返回相应的行。要限定相匹配的column_names,表别名是必需的。还可以使用ON子句来联接名称不相同的列。示例所示的联接列 (e.department_id = d.department_id)两边的圆括号是可选的。因此,即便是ON e.department_id = d.department_id效果也一样。
使用ON子句创建三向联接 hr@TEST0924> SELECT employee_id, city, department_name FROM employees e JOIN departments d 2 ON d.departm