Ich lerne Oracle SQL und jetzt bin ich auf Joins Kapitel fest. Ich kann nicht verstehen den Unterschied zwischen Join und Natur JoinWas ist der Unterschied zwischen Join und Natural Join?
SELECT employee_id, job_id, department_id,
e.last_name, e.hire_date, j.end_date
FROM employees e
NATURAL JOIN job_history j;
176 SA_REP 80 Taylor 24/03/2006 31/12/2006
SELECT e.employee_id, e.job_id, e.department_id,
e.last_name, e.hire_date, j.end_date
FROM employees e
JOIN job_history j
ON (e.department_id = j.department_id)
ORDER BY employee_id, last_name;
172 SA_REP 80 Bates 24/03/2007 31/12/2006
173 SA_REP 80 Kumar 21/04/2008 31/12/2007
173 SA_REP 80 Kumar 21/04/2008 31/12/2006
174 SA_REP 80 Abel 11/05/2004 31/12/2007
174 SA_REP 80 Abel 11/05/2004 31/12/2006
175 SA_REP 80 Hutton 19/03/2005 31/12/2007
175 SA_REP 80 Hutton 19/03/2005 31/12/2006
176 SA_REP 80 Taylor 24/03/2006 31/12/2007
176 SA_REP 80 Taylor 24/03/2006 31/12/2006
177 SA_REP 80 Livingston 23/04/2006 31/12/2007
177 SA_REP 80 Livingston 23/04/2006 31/12/2006
Ich weiß nicht, warum Ich erhalte unterschiedliche Ergebnisse, wenn sowohl Join als auch Natural Join eine ähnliche Funktion haben.
IMO, 'Natur Join' Verwendung ** implizite ** Join-Spalten, die alle Spalten mit demselben Namen in zwei Tabellen überprüfen und verbinden. Mit 'Join' müssen Sie ** explizite ** Join-Spalten in' ON'-Anweisungen deklarieren (vielleicht den gleichen Namen, vielleicht nicht, vielleicht hat 2 Tabellen 10 gleiche Spaltennamen, sondern nur 2 verschiedene Spaltennamen, ....). –
Ein gutes Beispiel dafür, warum Sie niemals natürliche Joins verwenden sollten. In Ihrem Fall verwendet der natürliche Join mehr Spalten, um ihn zu verknüpfen, was ihn restriktiver macht. Welche Spalten sind das? Ich weiß es nicht, weil es nicht gezeigt wird! –
Ein gutes Beispiel, bei dem ein kurzes Attribut, dessen Präfix lediglich durch seinen Tabellennamen impliziert wird, Probleme verursacht, wenn es in relationalen Operatoren verwendet wird, die andere Tabellen, z. 'end_date' in' employees', wo das explizite 'employment_end_date' besser wäre. – onedaywhen