2013-03-11 5 views
1
SELECT e.employee_id, e.last_name, d.department_id, d.location_id 
FROM employees e JOIN departments d 
ON (e.department_id=d.department_id); 

Que fait exactement la clause ON? Je suis confus sur pourquoi e.department_id et d.department_id ne provoque pas une erreur? Ne représente-t-il pas la table des employés et représente-t-elle la table des départements? Alors, comment pouvez-vous utiliser e.department_id si department_id n'est pas dans la table des employés? Je suis extrêmement confus au sujet de l'objectif de la clause ON.Oracle SQL: ON Clause

+2

'ON' est une partie de' clause JOIN' –

+2

Que voulez-vous dire par department_id n'est pas dans le table des employés? –

Répondre

2

La clause ON fait partie de la syntaxe JOIN et sert à identifier comment les tables doivent être jointes les unes aux autres, c'est-à-dire quelles colonnes relient les tables les unes aux autres.

Dans votre cas, vous joignez les tables sur le e.department_id et le d.department_id.

Le e est l'alias de la table employees et le d est l'alias de la table departments.

Votre requête en cours effectue une INNER JOIN qui renverra uniquement les lignes qui sont dans les deux tableaux correspondant.

Si vous voulez retourner tous employees même s'il n'y a pas departments associée à une ligne d'employé, vous voulez utiliser un LEFT JOIN:

SELECT e.employee_id, e.last_name, d.department_id, d.location_id 
FROM employees e 
LEFT JOIN departments d 
    ON e.department_id=d.department_id; 
+0

Je ne comprends toujours pas ce que fait l'ON (e.department_id = d.department_id)? Je comprends que l'ON les rapporte, mais comment? department_id n'est pas une colonne dans la table des employés (e), alors comment est-ce que cela les relie? –

+1

@KG - Vous devez en apprendre davantage sur '' Table JOIN's et Aliases' –

+1

@KG La table 'employees' a une colonne appelée' department_id' et fait donc le 'departments' table. Le 'ON' spécifie les colonnes sur lesquelles les tables sont jointes. Fondamentalement, il indique que vous voulez retourner les lignes que le 'department_id' correspond dans les deux tables. – Taryn

0

Je ne sais pas si cela vous aide à comprendre, mais il est possible (mais non recommandé) pour réécrire cette très requête avec jointure implicite dans une forme de WHERE clause:

SELECT e.employee_id, e.last_name, d.department_id, d.location_id 
FROM employees e, departments d 
WHERE (e.department_id=d.department_id); 
+0

Pourquoi n'est-il pas recommandé de faire ce que vous dites? J'aimerais savoir. – Phil

+0

@Phil - J'ai été dit que JOINtures explicites (surtout quand ils sont nombreux) sont plus faciles à lire et à maintenir. Je n'ai pas laissé entendre que cela a un impact sur la performance. –

+0

Je trouve plus facile à lire quand il est dans le 'WHERE' clause, mais qui est ma préférence personnelle. En fait, étant une question Oracle, c'est la norme pour Oracle comme '.. JOIN ..' n'a été introduit que relativement récemment. "bien que non recommandé" était entièrement votre préférence personnelle et ne devrait donc pas être indiqué dans une réponse. – Phil