SnowConvert AI – Oracle – Joins¶
Ein Join ist eine Abfrage, die Zeilen aus zwei oder mehr Tabellen, Ansichten oder materialisierten Ansichten kombiniert. Oracle Database führt eine Verknüpfung durch, wenn mehrere Tabellen in der
FROM-Klausel der Abfrage erscheinen. (Oracle SQL Language Reference JOINS)
Antijoin¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Ein Antijoin gibt Zeilen auf der linken Seite des Prädikats zurück, für die es keine entsprechenden Zeilen auf der rechten Seite des Prädikats gibt. Er gibt Zeilen zurück, die nicht mit der Unterabfrage auf der rechten Seite übereinstimmen (NOT IN). Die Antijoin-Transformation kann nicht durchgeführt werden, wenn sich die Unterabfrage auf einem
OR-Zweig derWHERE-Klausel befindet. (Oracle SQL Language Reference Anti Join).
Für diese Art von Join wird keine spezielle Transformation durchgeführt, da Snowflake dieselbe Syntax unterstützt.
Beispielhafte Quellcode-Muster¶
Bemerkung
Die ORDER BY-Klausel hinzugefügt, da die Reihenfolge der Ergebnisse zwischen Oracle und Snowflake variieren kann.
Bemerkung
Da die Ergebnismenge zu groß ist, wurde die Zeilenbegrenzungsklausel hinzugefügt. Sie können es entfernen, um das gesamte Resultset abzurufen.
Bemerkung
Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.
Nicht enthalten¶
Oracle¶
SELECT e.employee_id, e.first_name, e.last_name FROM hr.employees e
WHERE e.department_id NOT IN
(SELECT h.department_id FROM hr.departments h WHERE location_id = 1700)
ORDER BY e.last_name
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
|---|---|---|
174 |
Ellen |
Abel |
166 |
Sundar |
Ande |
130 |
Mozhe |
Atkinson |
105 |
David |
Austin |
204 |
Hermann |
Baer |
167 |
Amit |
Banda |
172 |
Elizabeth |
Bates |
192 |
Sarah |
Bell |
151 |
David |
Bernstein |
129 |
Laura |
Bissot |
Snowflake¶
SELECT e.employee_id, e.first_name, e.last_name FROM
hr.employees e
WHERE e.department_id NOT IN
!!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!!
(SELECT h.department_id FROM
hr.departments h WHERE location_id = 1700)
ORDER BY e.last_name
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
|---|---|---|
174 |
Ellen |
Abel |
166 |
Sundar |
Ande |
130 |
Mozhe |
Atkinson |
105 |
David |
Austin |
204 |
Hermann |
Baer |
167 |
Amit |
Banda |
172 |
Elizabeth |
Bates |
192 |
Sarah |
Bell |
151 |
David |
Bernstein |
129 |
Laura |
Bissot |
Nicht vorhanden¶
Oracle¶
SELECT d.department_id, d.department_name
FROM hr.departments d
WHERE NOT EXISTS
(SELECT 1 FROM hr.employees E WHERE
e.department_id = d.department_id)
ORDER BY d.department_id
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
DEPARTMENT_ID |
DEPARTMENT_NAME |
|---|---|
120 |
Schatzamt |
130 |
Unternehmenssteuer |
140 |
Controlling und Credit |
150 |
Aktionärsdienste |
160 |
Vorteile |
170 |
Manufacturing |
180 |
Konstruktion |
190 |
Verträge |
200 |
Operationen |
210 |
Unterstützung von IT |
Snowflake¶
SELECT d.department_id, d.department_name
FROM
hr.departments d
WHERE NOT EXISTS
!!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!!
(SELECT 1 FROM
hr.employees E WHERE
e.department_id = d.department_id)
ORDER BY d.department_id
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
DEPARTMENT_ID |
DEPARTMENT_NAME |
|---|---|
120 |
Schatzamt |
130 |
Unternehmenssteuer |
140 |
Controlling und Credit |
150 |
Aktionärsdienste |
160 |
Vorteile |
170 |
Manufacturing |
180 |
Konstruktion |
190 |
Verträge |
200 |
Operationen |
210 |
Unterstützung von IT |
Bekannte Probleme¶
1. Results ordering mismatch between languages¶
Das Ergebnis der Abfrage hat in beiden Datenbank-Engines den gleichen Inhalt, aber die Reihenfolge kann unterschiedlich sein, wenn in der Abfrage keine ORDER BY-Klausel definiert ist.
Band Join¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Ein Band Join ist ein spezieller Typ von nonequijoin, bei dem die Schlüsselwerte in einem Datensatz in den angegebenen Bereich („Band“) des zweiten Datensatzes fallen müssen. Dieselbe Tabelle kann sowohl als erster als auch als zweiter Datensatz dienen. (Oracle SQL Language Reference BandJoin)
In diesem Abschnitt werden wir sehen, wie ein Band Join in Snowflake ausgeführt wird. Der Ausführungsplan ist der verbesserten Version von Oracle sehr ähnlich.
Beispielhafte Quellcode-Muster¶
Bemerkung
ORDER BY-Klausel hinzugefügt, da die Reihenfolge der Ergebnisse zwischen Oracle und Snowflake variieren kann.
Bemerkung
Da die Ergebnismenge zu groß ist, wurde die Zeilenbegrenzungsklausel hinzugefügt. Sie können es entfernen, um das gesamte Resultset abzurufen.
Bemerkung
Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.
Warnung
Wenn Sie diesen Code ohne die Tabellenerstellung migrieren, kann der Konverter die semantischen Informationen der Spalten nicht laden und es wird eine Warnung bei den arithmetischen Operationen angezeigt.
Einfacher Band-Join-Fall¶
Oracle¶
SELECT e1.last_name ||
' has salary between 100 less and 100 more than ' ||
e2.last_name AS "SALARY COMPARISON"
FROM employees e1,
employees e2
WHERE e1.salary
BETWEEN e2.salary - 100
AND e2.salary + 100
ORDER BY "SALARY COMPARISON"
FETCH FIRST 10 ROWS ONLY
Ergebnis¶
SALARY-COMPARISON |
|---|
Abels Gehalt liegt zwischen 100 weniger und 100 mehr als das von Abel |
Abels Gehalt liegt zwischen 100 weniger und 100 mehr als das von Cambrault |
Abels Gehalt liegt zwischen 100 weniger und 100 mehr als das von Raphaely |
Andes Gehalt liegt zwischen 100 weniger und 100 mehr als das von Ande |
Andes Gehalt liegt zwischen 100 weniger und 100 mehr als das von Mavris |
Andes Gehalt liegt zwischen 100 weniger und 100 mehr als das von Vollman |
Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Atkinson |
Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Baida |
Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Gates |
Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Geoni |
Snowflake¶
SELECT
NVL( e1.last_name :: STRING, '') ||
' has salary between 100 less and 100 more than ' || NVL(
e2.last_name :: STRING, '') AS "SALARY COMPARISON"
FROM
employees e1,
employees e2
WHERE e1.salary
BETWEEN
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!! e2.salary - 100
AND
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!! e2.salary + 100
ORDER BY "SALARY COMPARISON"
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
SALARY-COMPARISON |
|---|
Abels Gehalt liegt zwischen 100 weniger und 100 mehr als das von Abel |
Abels Gehalt liegt zwischen 100 weniger und 100 mehr als das von Cambrault |
Abels Gehalt liegt zwischen 100 weniger und 100 mehr als das von Raphaely |
Andes Gehalt liegt zwischen 100 weniger und 100 mehr als das von Ande |
Andes Gehalt liegt zwischen 100 weniger und 100 mehr als das von Mavris |
Andes Gehalt liegt zwischen 100 weniger und 100 mehr als das von Vollman |
Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Atkinson |
Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Baida |
Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Gates |
Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Geoni |
Warnung
Die Migration einiger SELECT-Anweisungen ohne die entsprechenden Tabellen könnte zu einem SSC-EWI-OR0036 führen: Probleme bei der Auflösung von Typen. Um diese Warnung zu vermeiden, fügen Sie CREATE TABLE innerhalb der Datei ein.
Die Ergebnisse sind die gleichen, so dass BAND JOIN funktional gleichwertig ist.
Ausführungsplan
Als zusätzliche Information ist das Besondere an Band Joins der Ausführungsplan.
Das folgende Bild zeigt den erweiterten Ausführungsplan (implementiert seit Oracle 12c) für die Testabfrage:

Und im folgenden Bild sehen wir den Ausführungsplan in Snowflake:

Bemerkung
Der Ausführungsplan in Snowflake ist der optimierten Version von Oracle sehr ähnlich. Die endgültige Dauer und Leistung der Abfrage wird von vielen anderen Faktoren beeinflusst und hängt vollständig von der internen Funktionalität der einzelnen DBMS ab.
Bekannte Probleme¶
1. Results ordering mismatch between languages¶
Das Ergebnis der Abfrage hat in beiden Datenbank-Engines den gleichen Inhalt, aber die Reihenfolge kann unterschiedlich sein, wenn in der Abfrage keine ORDER BY-Klausel definiert ist.
Zugehörige EWIs¶
SSC-EWI-OR0036: Bei Problemen mit der Auflösung von Typen verhält sich die arithmetische Operation zwischen Zeichenfolge und Datum möglicherweise nicht korrekt.
Kartesische Produkte¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Wenn zwei Tabellen in einer Datenbankabfrage keine Join-Bedingung haben, dann gibt Oracle Database ihr kartesisches Produkt zurück. Oracle kombiniert jede Zeile der einen Tabelle mit jeder Zeile der anderen. (Oracle SQL-Referenz: Unterabschnitt „Kartesische Produkte“)
Oracle und Snowflake sind auch mit der ANSI-Cross Join-Syntax kompatibel, die die gleiche Verhaltensweise wie ein kartesisches Produkt hat.
Für diese Art von Join wird keine spezielle Transformation durchgeführt, da Snowflake dieselbe Syntax unterstützt.
Beispielhafte Quellcode-Muster¶
Bemerkung
Die ORDER BY-Klausel wurde hinzugefügt, weil die Reihenfolge der Ergebnisse zwischen Oracle und Snowflake variieren kann.
Bemerkung
Da die Ergebnismenge zu groß ist, wurde die Zeilenbegrenzungsklausel hinzugefügt. Sie können es entfernen, um das gesamte Resultset abzurufen.
Bemerkung
Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.
Implizite Syntax¶
Oracle¶
-- Resulting rows
SELECT * FROM hr.employees, hr.departments
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY;
-- Resulting total rows
SELECT COUNT(*) FROM hr.employees, hr.departments;
Ergebnis 1¶
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
MANAGER_ID |
DEPARTMENT_ID |
DEPARTMENT_ID |
DEPARTMENT_NAME |
MANAGER_ID |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 00:00:00.000 |
ST_MAN |
8200 |
100 |
50 |
10 |
Administration |
200 |
1700 |
|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 00:00:00.000 |
ST_MAN |
8200 |
100 |
50 |
50 |
Versand |
121 |
1500 |
|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 00:00:00.000 |
ST_MAN |
8200 |
100 |
50 |
40 |
Human Resources |
203 |
2400 |
|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 00:00:00.000 |
ST_MAN |
8200 |
100 |
50 |
30 |
Purchasing |
114 |
1700 |
|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 00:00:00.000 |
ST_MAN |
8200 |
100 |
50 |
20 |
Marketing |
201 |
1800 |
Ergebnis 2¶
COUNT(*) |
|---|
2889 |
Snowflake¶
-- Resulting rows
SELECT * FROM
hr.employees,
hr.departments
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY;
-- Resulting total rows
SELECT COUNT(*) FROM
hr.employees,
hr.departments;
Ergebnis 1¶
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
MANAGER_ID |
DEPARTMENT_ID |
DEPARTMENT_ID |
DEPARTMENT_NAME |
MANAGER_ID |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 |
ST_MAN |
8200.00 |
100 |
50 |
40 |
Human Resources |
203 |
2400 |
|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 |
ST_MAN |
8200.00 |
100 |
50 |
20 |
Marketing |
201 |
1800 |
|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 |
ST_MAN |
8200.00 |
100 |
50 |
10 |
Administration |
200 |
1700 |
|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 |
ST_MAN |
8200.00 |
100 |
50 |
50 |
Versand |
121 |
1500 |
|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 |
ST_MAN |
8200.00 |
100 |
50 |
30 |
Purchasing |
114 |
1700 |
Ergebnis 2¶
COUNT(*) |
|---|
2889 |
Syntax für Kreuzverknüpfungen (Cross Join Syntax)¶
Oracle¶
-- Resulting rows
SELECT * FROM hr.employees CROSS join hr.departments
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY;
-- Resulting total rows
SELECT COUNT(*) FROM hr.employees CROSS join hr.departments;
Ergebnis 1¶
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
MANAGER_ID |
DEPARTMENT_ID |
DEPARTMENT_ID |
DEPARTMENT_NAME |
MANAGER_ID |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 00:00:00.000 |
ST_MAN |
8200 |
100 |
50 |
10 |
Administration |
200 |
1700 |
|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 00:00:00.000 |
ST_MAN |
8200 |
100 |
50 |
50 |
Versand |
121 |
1500 |
|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 00:00:00.000 |
ST_MAN |
8200 |
100 |
50 |
40 |
Human Resources |
203 |
2400 |
|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 00:00:00.000 |
ST_MAN |
8200 |
100 |
50 |
30 |
Purchasing |
114 |
1700 |
|
121 |
Adam |
Fripp |
AFRIPP |
650.123.2234 |
2005-04-10 00:00:00.000 |
ST_MAN |
8200 |
100 |
50 |
20 |
Marketing |
201 |
1800 |
Ergebnis 2¶
COUNT(*) |
|---|
2889 |
Snowflake¶
-- Resulting rows
SELECT * FROM
hr.employees
CROSS join hr.departments
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY;
-- Resulting total rows
SELECT COUNT(*) FROM
hr.employees
CROSS join hr.departments;
Bekannte Probleme¶
1. Results ordering mismatch between languages¶
Das Ergebnis der Abfrage hat in beiden Datenbank-Engines den gleichen Inhalt, aber die Reihenfolge kann unterschiedlich sein, wenn in der Abfrage keine ORDER BY-Klausel definiert ist.
Zugehörige EWIs¶
Keine zugehörigen EWIs.
Equijoin¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Ein Equijoin ist eine implizite Form der Verknüpfung mit einer Join-Bedingung, die einen Gleichheitsoperator enthält. Weitere Informationen zu Oracle Equijoin finden Sie hier.
Für diese Art von Join wird keine spezielle Transformation durchgeführt, da Snowflake dieselbe Syntax unterstützt.
Beispielhafte Quellcode-Muster¶
Bemerkung
Die ORDER BY-Klausel hinzugefügt, da die Reihenfolge der Ergebnisse zwischen Oracle und Snowflake variieren kann.
Bemerkung
Da das Resultset zu groß ist, wurde die Zeilenbegrenzungsklausel hinzugefügt. Sie können es entfernen, um das gesamte Resultset abzurufen.
Bemerkung
Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.
Grundlegender Equijoin-Fall¶
Oracle¶
SELECT last_name, job_id, hr.departments.department_id, department_name
FROM hr.employees, hr.departments
WHERE hr.employees.department_id = hr.departments.department_id
ORDER BY last_name
FETCH FIRST 5 ROWS ONLY;
Ergebnis¶
LAST_NAME |
JOB_ID |
DEPARTMENT_ID |
DEPARTMENT_NAME |
|---|---|---|---|
Abel |
SA_REP |
80 |
Sales |
Ande |
SA_REP |
80 |
Sales |
Atkinson |
ST_CLERK |
50 |
Versand |
Austin |
IT_PROG |
60 |
IT |
Baer |
PR_REP |
70 |
Public Relations |
Snowflake¶
SELECT last_name, job_id, hr.departments.department_id, department_name
FROM
hr.employees,
hr.departments
WHERE hr.employees.department_id = hr.departments.department_id
ORDER BY last_name
FETCH FIRST 5 ROWS ONLY;
Ergebnis¶
LAST_NAME |
JOB_ID |
DEPARTMENT_ID |
DEPARTMENT_NAME |
|---|---|---|---|
Abel |
SA_REP |
80 |
Sales |
Ande |
SA_REP |
80 |
Sales |
Atkinson |
ST_CLERK |
50 |
Versand |
Austin |
IT_PROG |
60 |
IT |
Baer |
PR_REP |
70 |
Public Relations |
Bekannte Probleme¶
1. Results ordering mismatch between languages¶
Das Ergebnis der Abfrage hat in beiden Datenbank-Engines den gleichen Inhalt, aber die Reihenfolge kann unterschiedlich sein, wenn in der Abfrage keine ORDER BY-Klausel definiert ist.
Zugehörige EWIs¶
Keine zugehörigen EWIs.
Innere Verknüpfung (Inner Join)¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Ein Inner Join (manchmal auch einfacher Join genannt) ist eine Verknüpfung von zwei oder mehr Tabellen, die nur die Zeilen zurückgibt, die die Join-Bedingung erfüllen. (Oracle SQL Referenz: Unterabschnitt Inner Join).
{ [ INNER ] JOIN table_reference
{ ON condition
| USING (column [, column ]...)
}
| { CROSS
| NATURAL [ INNER ]
}
JOIN table_reference
}
Beispielhafte Quellcode-Muster¶
Bemerkung
ORDER BY-Klausel hinzugefügt, da die Reihenfolge der Ergebnisse zwischen Oracle und Snowflake variieren kann.
Bemerkung
Da die Ergebnismenge zu groß ist, wurde die Zeilenbegrenzungsklausel hinzugefügt. Sie können diese Klausel entfernen, um die Ergebnismenge abzurufen.
Bemerkung
Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.
Grundlegender Inner Join¶
In der INNER JOIN-Klausel ist INNER ein optionales Schlüsselwort. Die folgenden Abfragen haben zwei Selects, die denselben Datensatz abrufen.
Oracle¶
SELECT
*
FROM
hr.employees
INNER JOIN hr.departments ON
hr.departments.department_id = hr.employees.department_id
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
SELECT
*
FROM
hr.employees
JOIN hr.departments ON
hr.departments.department_id = hr.employees.department_id
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Ergebnis¶
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
MANAGER_ID |
DEPARTMENT_ID |
DEPARTMENT_ID |
DEPARTMENT_NAME |
MANAGER_ID |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 00:00:00.000 |
AD_PRES |
24000 |
90 |
90 |
Executive |
100 |
1700 |
||
101 |
Neena |
Kochhar |
NKOCHHAR |
515.123.4568 |
2005-09-21 00:00:00.000 |
AD_VP |
17000 |
100 |
90 |
90 |
Executive |
100 |
1700 |
|
102 |
Lex |
De Haan |
LDEHAAN |
515.123.4569 |
2001-01-13 00:00:00.000 |
AD_VP |
17000 |
100 |
90 |
90 |
Executive |
100 |
1700 |
|
103 |
Alexander |
Hunold |
AHUNOLD |
590.423.4567 |
2006-01-03 00:00:00.000 |
IT_PROG |
9000 |
102 |
60 |
60 |
IT |
103 |
1400 |
|
104 |
Bruce |
Ernst |
BERNST |
590.423.4568 |
2007-05-21 00:00:00.000 |
IT_PROG |
6000 |
103 |
60 |
60 |
IT |
103 |
1400 |
|
105 |
David |
Austin |
DAUSTIN |
590.423.4569 |
2005-06-25 00:00:00.000 |
IT_PROG |
4800 |
103 |
60 |
60 |
IT |
103 |
1400 |
|
106 |
Valli |
Pataballa |
VPATABAL |
590.423.4560 |
2006-02-05 00:00:00.000 |
IT_PROG |
4800 |
103 |
60 |
60 |
IT |
103 |
1400 |
|
107 |
Diana |
Lorentz |
DLORENTZ |
590.423.5567 |
2007-02-07 00:00:00.000 |
IT_PROG |
4200 |
103 |
60 |
60 |
IT |
103 |
1400 |
|
108 |
Nancy |
Greenberg |
NGREENBE |
515.124.4569 |
2002-08-17 00:00:00.000 |
FI_MGR |
12008 |
101 |
100 |
100 |
Finanzen |
108 |
1700 |
|
109 |
Daniel |
Faviet |
DFAVIET |
515.124.4169 |
2002-08-16 00:00:00.000 |
FI_ACCOUNT |
9000 |
108 |
100 |
100 |
Finanzen |
108 |
1700 |
Snowflake¶
SELECT
*
FROM
hr.employees
INNER JOIN
hr.departments
ON
hr.departments.department_id = hr.employees.department_id
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
SELECT
*
FROM
hr.employees
JOIN
hr.departments
ON
hr.departments.department_id = hr.employees.department_id
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Ergebnis¶
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
MANAGER_ID |
DEPARTMENT_ID |
DEPARTMENT_ID |
DEPARTMENT_NAME |
MANAGER_ID |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 |
AD_PRES |
24000.00 |
90 |
90 |
Executive |
100 |
1700 |
||
101 |
Neena |
Kochhar |
NKOCHHAR |
515.123.4568 |
2005-09-21 |
AD_VP |
17000.00 |
100 |
90 |
90 |
Executive |
100 |
1700 |
|
102 |
Lex |
De Haan |
LDEHAAN |
515.123.4569 |
2001-01-13 |
AD_VP |
17000.00 |
100 |
90 |
90 |
Executive |
100 |
1700 |
|
103 |
Alexander |
Hunold |
AHUNOLD |
590.423.4567 |
2006-01-03 |
IT_PROG |
9000.00 |
102 |
60 |
60 |
IT |
103 |
1400 |
|
104 |
Bruce |
Ernst |
BERNST |
590.423.4568 |
2007-05-21 |
IT_PROG |
6000.00 |
103 |
60 |
60 |
IT |
103 |
1400 |
|
105 |
David |
Austin |
DAUSTIN |
590.423.4569 |
2005-06-25 |
IT_PROG |
4800.00 |
103 |
60 |
60 |
IT |
103 |
1400 |
|
106 |
Valli |
Pataballa |
VPATABAL |
590.423.4560 |
2006-02-05 |
IT_PROG |
4800.00 |
103 |
60 |
60 |
IT |
103 |
1400 |
|
107 |
Diana |
Lorentz |
DLORENTZ |
590.423.5567 |
2007-02-07 |
IT_PROG |
4200.00 |
103 |
60 |
60 |
IT |
103 |
1400 |
|
108 |
Nancy |
Greenberg |
NGREENBE |
515.124.4569 |
2002-08-17 |
FI_MGR |
12008.00 |
101 |
100 |
100 |
Finanzen |
108 |
1700 |
|
109 |
Daniel |
Faviet |
DFAVIET |
515.124.4169 |
2002-08-16 |
FI_ACCOUNT |
9000.00 |
108 |
100 |
100 |
Finanzen |
108 |
1700 |
INNER JOIN mit Klausel¶
Oracle¶
SELECT
*
FROM
hr.employees
INNER JOIN hr.departments
USING(department_id)
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Ergebnis¶
DEPARTMENT_ID |
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
MANAGER_ID |
DEPARTMENT_NAME |
MANAGER_ID |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
90 |
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 00:00:00.000 |
AD_PRES |
24000 |
Executive |
100 |
1700 |
||
90 |
101 |
Neena |
Kochhar |
NKOCHHAR |
515.123.4568 |
2005-09-21 00:00:00.000 |
AD_VP |
17000 |
100 |
Executive |
100 |
1700 |
|
90 |
102 |
Lex |
De Haan |
LDEHAAN |
515.123.4569 |
2001-01-13 00:00:00.000 |
AD_VP |
17000 |
100 |
Executive |
100 |
1700 |
|
60 |
103 |
Alexander |
Hunold |
AHUNOLD |
590.423.4567 |
2006-01-03 00:00:00.000 |
IT_PROG |
9000 |
102 |
IT |
103 |
1400 |
|
60 |
104 |
Bruce |
Ernst |
BERNST |
590.423.4568 |
2007-05-21 00:00:00.000 |
IT_PROG |
6000 |
103 |
IT |
103 |
1400 |
|
60 |
105 |
David |
Austin |
DAUSTIN |
590.423.4569 |
2005-06-25 00:00:00.000 |
IT_PROG |
4800 |
103 |
IT |
103 |
1400 |
|
60 |
106 |
Valli |
Pataballa |
VPATABAL |
590.423.4560 |
2006-02-05 00:00:00.000 |
IT_PROG |
4800 |
103 |
IT |
103 |
1400 |
|
60 |
107 |
Diana |
Lorentz |
DLORENTZ |
590.423.5567 |
2007-02-07 00:00:00.000 |
IT_PROG |
4200 |
103 |
IT |
103 |
1400 |
|
100 |
108 |
Nancy |
Greenberg |
NGREENBE |
515.124.4569 |
2002-08-17 00:00:00.000 |
FI_MGR |
12008 |
101 |
Finanzen |
108 |
1700 |
|
100 |
109 |
Daniel |
Faviet |
DFAVIET |
515.124.4169 |
2002-08-16 00:00:00.000 |
FI_ACCOUNT |
9000 |
108 |
Finanzen |
108 |
1700 |
Snowflake¶
SELECT
*
FROM
hr.employees
INNER JOIN
hr.departments
USING(department_id)
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Ergebnis¶
DEPARTMENT_ID |
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
MANAGER_ID |
DEPARTMENT_NAME |
MANAGER_ID |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
90 |
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 |
AD_PRES |
24000.00 |
Executive |
100 |
1700 |
||
90 |
101 |
Neena |
Kochhar |
NKOCHHAR |
515.123.4568 |
2005-09-21 |
AD_VP |
17000.00 |
100 |
Executive |
100 |
1700 |
|
90 |
102 |
Lex |
De Haan |
LDEHAAN |
515.123.4569 |
2001-01-13 |
AD_VP |
17000.00 |
100 |
Executive |
100 |
1700 |
|
60 |
103 |
Alexander |
Hunold |
AHUNOLD |
590.423.4567 |
2006-01-03 |
IT_PROG |
9000.00 |
102 |
IT |
103 |
1400 |
|
60 |
104 |
Bruce |
Ernst |
BERNST |
590.423.4568 |
2007-05-21 |
IT_PROG |
6000.00 |
103 |
IT |
103 |
1400 |
|
60 |
105 |
David |
Austin |
DAUSTIN |
590.423.4569 |
2005-06-25 |
IT_PROG |
4800.00 |
103 |
IT |
103 |
1400 |
|
60 |
106 |
Valli |
Pataballa |
VPATABAL |
590.423.4560 |
2006-02-05 |
IT_PROG |
4800.00 |
103 |
IT |
103 |
1400 |
|
60 |
107 |
Diana |
Lorentz |
DLORENTZ |
590.423.5567 |
2007-02-07 |
IT_PROG |
4200.00 |
103 |
IT |
103 |
1400 |
|
100 |
108 |
Nancy |
Greenberg |
NGREENBE |
515.124.4569 |
2002-08-17 |
FI_MGR |
12008.00 |
101 |
Finanzen |
108 |
1700 |
|
100 |
109 |
Daniel |
Faviet |
DFAVIET |
515.124.4169 |
2002-08-16 |
FI_ACCOUNT |
9000.00 |
108 |
Finanzen |
108 |
1700 |
Cross Inner Join¶
Oracle¶
SELECT
*
FROM
hr.employees
CROSS JOIN hr.departments
ORDER BY department_name, employee_id
FETCH NEXT 10 ROWS ONLY;
Ergebnis¶
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
MANAGER_ID |
DEPARTMENT_ID |
DEPARTMENT_ID |
DEPARTMENT_NAME |
MANAGER_ID |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 00:00:00.000 |
AD_PRES |
24000 |
90 |
110 |
Buchhaltung |
205 |
1700 |
||
101 |
Neena |
Kochhar |
NKOCHHAR |
515.123.4568 |
2005-09-21 00:00:00.000 |
AD_VP |
17000 |
100 |
90 |
110 |
Buchhaltung |
205 |
1700 |
|
102 |
Lex |
De Haan |
LDEHAAN |
515.123.4569 |
2001-01-13 00:00:00.000 |
AD_VP |
17000 |
100 |
90 |
110 |
Buchhaltung |
205 |
1700 |
|
103 |
Alexander |
Hunold |
AHUNOLD |
590.423.4567 |
2006-01-03 00:00:00.000 |
IT_PROG |
9000 |
102 |
60 |
110 |
Buchhaltung |
205 |
1700 |
|
104 |
Bruce |
Ernst |
BERNST |
590.423.4568 |
2007-05-21 00:00:00.000 |
IT_PROG |
6000 |
103 |
60 |
110 |
Buchhaltung |
205 |
1700 |
|
105 |
David |
Austin |
DAUSTIN |
590.423.4569 |
2005-06-25 00:00:00.000 |
IT_PROG |
4800 |
103 |
60 |
110 |
Buchhaltung |
205 |
1700 |
|
106 |
Valli |
Pataballa |
VPATABAL |
590.423.4560 |
2006-02-05 00:00:00.000 |
IT_PROG |
4800 |
103 |
60 |
110 |
Buchhaltung |
205 |
1700 |
|
107 |
Diana |
Lorentz |
DLORENTZ |
590.423.5567 |
2007-02-07 00:00:00.000 |
IT_PROG |
4200 |
103 |
60 |
110 |
Buchhaltung |
205 |
1700 |
|
108 |
Nancy |
Greenberg |
NGREENBE |
515.124.4569 |
2002-08-17 00:00:00.000 |
FI_MGR |
12008 |
101 |
100 |
110 |
Buchhaltung |
205 |
1700 |
|
109 |
Daniel |
Faviet |
DFAVIET |
515.124.4169 |
2002-08-16 00:00:00.000 |
FI_ACCOUNT |
9000 |
108 |
100 |
110 |
Buchhaltung |
205 |
1700 |
Snowflake¶
SELECT
*
FROM
hr.employees
CROSS JOIN hr.departments
ORDER BY department_name, employee_id
FETCH NEXT 10 ROWS ONLY;
Ergebnis¶
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
MANAGER_ID |
DEPARTMENT_ID |
DEPARTMENT_ID |
DEPARTMENT_NAME |
MANAGER_ID |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 |
AD_PRES |
24000.00 |
90 |
110 |
Buchhaltung |
205 |
1700 |
||
101 |
Neena |
Kochhar |
NKOCHHAR |
515.123.4568 |
2005-09-21 |
AD_VP |
17000.00 |
100 |
90 |
110 |
Buchhaltung |
205 |
1700 |
|
102 |
Lex |
De Haan |
LDEHAAN |
515.123.4569 |
2001-01-13 |
AD_VP |
17000.00 |
100 |
90 |
110 |
Buchhaltung |
205 |
1700 |
|
103 |
Alexander |
Hunold |
AHUNOLD |
590.423.4567 |
2006-01-03 |
IT_PROG |
9000.00 |
102 |
60 |
110 |
Buchhaltung |
205 |
1700 |
|
104 |
Bruce |
Ernst |
BERNST |
590.423.4568 |
2007-05-21 |
IT_PROG |
6000.00 |
103 |
60 |
110 |
Buchhaltung |
205 |
1700 |
|
105 |
David |
Austin |
DAUSTIN |
590.423.4569 |
2005-06-25 |
IT_PROG |
4800.00 |
103 |
60 |
110 |
Buchhaltung |
205 |
1700 |
|
106 |
Valli |
Pataballa |
VPATABAL |
590.423.4560 |
2006-02-05 |
IT_PROG |
4800.00 |
103 |
60 |
110 |
Buchhaltung |
205 |
1700 |
|
107 |
Diana |
Lorentz |
DLORENTZ |
590.423.5567 |
2007-02-07 |
IT_PROG |
4200.00 |
103 |
60 |
110 |
Buchhaltung |
205 |
1700 |
|
108 |
Nancy |
Greenberg |
NGREENBE |
515.124.4569 |
2002-08-17 |
FI_MGR |
12008.00 |
101 |
100 |
110 |
Buchhaltung |
205 |
1700 |
|
109 |
Daniel |
Faviet |
DFAVIET |
515.124.4169 |
2002-08-16 |
FI_ACCOUNT |
9000.00 |
108 |
100 |
110 |
Buchhaltung |
205 |
1700 |
Natural Inner Join¶
Oracle¶
SELECT
*
FROM
hr.employees
NATURAL JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Ergebnis¶
MANAGER_ID |
DEPARTMENT_ID |
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
DEPARTMENT_NAME |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
100 |
90 |
101 |
Neena |
Kochhar |
NKOCHHAR |
515.123.4568 |
2005-09-21 00:00:00.000 |
AD_VP |
17000 |
Executive |
1700 |
|
100 |
90 |
102 |
Lex |
De Haan |
LDEHAAN |
515.123.4569 |
2001-01-13 00:00:00.000 |
AD_VP |
17000 |
Executive |
1700 |
|
103 |
60 |
104 |
Bruce |
Ernst |
BERNST |
590.423.4568 |
2007-05-21 00:00:00.000 |
IT_PROG |
6000 |
IT |
1400 |
|
103 |
60 |
105 |
David |
Austin |
DAUSTIN |
590.423.4569 |
2005-06-25 00:00:00.000 |
IT_PROG |
4800 |
IT |
1400 |
|
103 |
60 |
106 |
Valli |
Pataballa |
VPATABAL |
590.423.4560 |
2006-02-05 00:00:00.000 |
IT_PROG |
4800 |
IT |
1400 |
|
103 |
60 |
107 |
Diana |
Lorentz |
DLORENTZ |
590.423.5567 |
2007-02-07 00:00:00.000 |
IT_PROG |
4200 |
IT |
1400 |
|
108 |
100 |
109 |
Daniel |
Faviet |
DFAVIET |
515.124.4169 |
2002-08-16 00:00:00.000 |
FI_ACCOUNT |
9000 |
Finanzen |
1700 |
|
108 |
100 |
110 |
John |
Chen |
JCHEN |
515.124.4269 |
2005-09-28 00:00:00.000 |
FI_ACCOUNT |
8200 |
Finanzen |
1700 |
|
108 |
100 |
111 |
Ismael |
Sciarra |
ISCIARRA |
515.124.4369 |
2005-09-30 00:00:00.000 |
FI_ACCOUNT |
7700 |
Finanzen |
1700 |
|
108 |
100 |
112 |
Jose Manuel |
Urman |
JMURMAN |
515.124.4469 |
2006-03-07 00:00:00.000 |
FI_ACCOUNT |
7800 |
Finanzen |
1700 |
Snowflake¶
SELECT
*
FROM
hr.employees
NATURAL JOIN
hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Ergebnis¶
MANAGER_ID |
DEPARTMENT_ID |
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
DEPARTMENT_NAME |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
100 |
90 |
101 |
Neena |
Kochhar |
NKOCHHAR |
515.123.4568 |
2005-09-21 |
AD_VP |
17000.00 |
Executive |
1700 |
|
100 |
90 |
102 |
Lex |
De Haan |
LDEHAAN |
515.123.4569 |
2001-01-13 |
AD_VP |
17000.00 |
Executive |
1700 |
|
103 |
60 |
104 |
Bruce |
Ernst |
BERNST |
590.423.4568 |
2007-05-21 |
IT_PROG |
6000.00 |
IT |
1400 |
|
103 |
60 |
105 |
David |
Austin |
DAUSTIN |
590.423.4569 |
2005-06-25 |
IT_PROG |
4800.00 |
IT |
1400 |
|
103 |
60 |
106 |
Valli |
Pataballa |
VPATABAL |
590.423.4560 |
2006-02-05 |
IT_PROG |
4800.00 |
IT |
1400 |
|
103 |
60 |
107 |
Diana |
Lorentz |
DLORENTZ |
590.423.5567 |
2007-02-07 |
IT_PROG |
4200.00 |
IT |
1400 |
|
108 |
100 |
109 |
Daniel |
Faviet |
DFAVIET |
515.124.4169 |
2002-08-16 |
FI_ACCOUNT |
9000.00 |
Finanzen |
1700 |
|
108 |
100 |
110 |
John |
Chen |
JCHEN |
515.124.4269 |
2005-09-28 |
FI_ACCOUNT |
8200.00 |
Finanzen |
1700 |
|
108 |
100 |
111 |
Ismael |
Sciarra |
ISCIARRA |
515.124.4369 |
2005-09-30 |
FI_ACCOUNT |
7700.00 |
Finanzen |
1700 |
|
108 |
100 |
112 |
Jose Manuel |
Urman |
JMURMAN |
515.124.4469 |
2006-03-07 |
FI_ACCOUNT |
7800.00 |
Finanzen |
1700 |
Cross Natural Join¶
Oracle¶
SELECT
*
FROM
hr.employees
CROSS NATURAL JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Ergebnis¶
MANAGER_ID |
DEPARTMENT_ID |
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
DEPARTMENT_NAME |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
100 |
90 |
101 |
Neena |
Kochhar |
NKOCHHAR |
515.123.4568 |
2005-09-21 00:00:00.000 |
AD_VP |
17000 |
Executive |
1700 |
|
100 |
90 |
102 |
Lex |
De Haan |
LDEHAAN |
515.123.4569 |
2001-01-13 00:00:00.000 |
AD_VP |
17000 |
Executive |
1700 |
|
103 |
60 |
104 |
Bruce |
Ernst |
BERNST |
590.423.4568 |
2007-05-21 00:00:00.000 |
IT_PROG |
6000 |
IT |
1400 |
|
103 |
60 |
105 |
David |
Austin |
DAUSTIN |
590.423.4569 |
2005-06-25 00:00:00.000 |
IT_PROG |
4800 |
IT |
1400 |
|
103 |
60 |
106 |
Valli |
Pataballa |
VPATABAL |
590.423.4560 |
2006-02-05 00:00:00.000 |
IT_PROG |
4800 |
IT |
1400 |
|
103 |
60 |
107 |
Diana |
Lorentz |
DLORENTZ |
590.423.5567 |
2007-02-07 00:00:00.000 |
IT_PROG |
4200 |
IT |
1400 |
|
108 |
100 |
109 |
Daniel |
Faviet |
DFAVIET |
515.124.4169 |
2002-08-16 00:00:00.000 |
FI_ACCOUNT |
9000 |
Finanzen |
1700 |
|
108 |
100 |
110 |
John |
Chen |
JCHEN |
515.124.4269 |
2005-09-28 00:00:00.000 |
FI_ACCOUNT |
8200 |
Finanzen |
1700 |
|
108 |
100 |
111 |
Ismael |
Sciarra |
ISCIARRA |
515.124.4369 |
2005-09-30 00:00:00.000 |
FI_ACCOUNT |
7700 |
Finanzen |
1700 |
|
108 |
100 |
112 |
Jose Manuel |
Urman |
JMURMAN |
515.124.4469 |
2006-03-07 00:00:00.000 |
FI_ACCOUNT |
7800 |
Finanzen |
1700 |
Snowflake¶
SELECT
*
FROM
hr.employees
NATURAL JOIN
hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Ergebnis¶
MANAGER_ID |
DEPARTMENT_ID |
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
DEPARTMENT_NAME |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
100 |
90 |
101 |
Neena |
Kochhar |
NKOCHHAR |
515.123.4568 |
2005-09-21 |
AD_VP |
17000.00 |
Executive |
1700 |
|
100 |
90 |
102 |
Lex |
De Haan |
LDEHAAN |
515.123.4569 |
2001-01-13 |
AD_VP |
17000.00 |
Executive |
1700 |
|
103 |
60 |
104 |
Bruce |
Ernst |
BERNST |
590.423.4568 |
2007-05-21 |
IT_PROG |
6000.00 |
IT |
1400 |
|
103 |
60 |
105 |
David |
Austin |
DAUSTIN |
590.423.4569 |
2005-06-25 |
IT_PROG |
4800.00 |
IT |
1400 |
|
103 |
60 |
106 |
Valli |
Pataballa |
VPATABAL |
590.423.4560 |
2006-02-05 |
IT_PROG |
4800.00 |
IT |
1400 |
|
103 |
60 |
107 |
Diana |
Lorentz |
DLORENTZ |
590.423.5567 |
2007-02-07 |
IT_PROG |
4200.00 |
IT |
1400 |
|
108 |
100 |
109 |
Daniel |
Faviet |
DFAVIET |
515.124.4169 |
2002-08-16 |
FI_ACCOUNT |
9000.00 |
Finanzen |
1700 |
|
108 |
100 |
110 |
John |
Chen |
JCHEN |
515.124.4269 |
2005-09-28 |
FI_ACCOUNT |
8200.00 |
Finanzen |
1700 |
|
108 |
100 |
111 |
Ismael |
Sciarra |
ISCIARRA |
515.124.4369 |
2005-09-30 |
FI_ACCOUNT |
7700.00 |
Finanzen |
1700 |
|
108 |
100 |
112 |
Jose Manuel |
Urman |
JMURMAN |
515.124.4469 |
2006-03-07 |
FI_ACCOUNT |
7800.00 |
Finanzen |
1700 |
Natural Cross Join¶
Oracle¶
SELECT
*
FROM
hr.employees
NATURAL CROSS JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Ergebnis¶
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
MANAGER_ID |
DEPARTMENT_ID |
DEPARTMENT_ID |
DEPARTMENT_NAME |
MANAGER_ID |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 00:00:00.000 |
AD_PRES |
24000 |
90 |
10 |
Administration |
200 |
1700 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 00:00:00.000 |
AD_PRES |
24000 |
90 |
100 |
Finanzen |
108 |
1700 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 00:00:00.000 |
AD_PRES |
24000 |
90 |
90 |
Executive |
100 |
1700 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 00:00:00.000 |
AD_PRES |
24000 |
90 |
80 |
Sales |
145 |
2500 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 00:00:00.000 |
AD_PRES |
24000 |
90 |
70 |
Public Relations |
204 |
2700 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 00:00:00.000 |
AD_PRES |
24000 |
90 |
60 |
IT |
103 |
1400 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 00:00:00.000 |
AD_PRES |
24000 |
90 |
50 |
Versand |
121 |
1500 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 00:00:00.000 |
AD_PRES |
24000 |
90 |
40 |
Human Resources |
203 |
2400 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 00:00:00.000 |
AD_PRES |
24000 |
90 |
30 |
Purchasing |
114 |
1700 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 00:00:00.000 |
AD_PRES |
24000 |
90 |
20 |
Marketing |
201 |
1800 |
Snowflake¶
SELECT
*
FROM
hr.employees
CROSS JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Ergebnis¶
EMPLOYEE_ID |
FIRST_NAME |
LAST_NAME |
PHONE_NUMBER |
HIRE_DATE |
JOB_ID |
SALARY |
COMMISSION_PCT |
MANAGER_ID |
DEPARTMENT_ID |
DEPARTMENT_ID |
DEPARTMENT_NAME |
MANAGER_ID |
LOCATION_ID |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 |
AD_PRES |
24000.00 |
90 |
80 |
Sales |
145 |
2500 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 |
AD_PRES |
24000.00 |
90 |
20 |
Marketing |
201 |
1800 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 |
AD_PRES |
24000.00 |
90 |
60 |
IT |
103 |
1400 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 |
AD_PRES |
24000.00 |
90 |
70 |
Public Relations |
204 |
2700 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 |
AD_PRES |
24000.00 |
90 |
90 |
Executive |
100 |
1700 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 |
AD_PRES |
24000.00 |
90 |
30 |
Purchasing |
114 |
1700 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 |
AD_PRES |
24000.00 |
90 |
10 |
Administration |
200 |
1700 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 |
AD_PRES |
24000.00 |
90 |
100 |
Finanzen |
108 |
1700 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 |
AD_PRES |
24000.00 |
90 |
50 |
Versand |
121 |
1500 |
||
100 |
Steven |
King |
SKING |
515.123.4567 |
2003-06-17 |
AD_PRES |
24000.00 |
90 |
40 |
Human Resources |
203 |
2400 |
Bekannte Probleme¶
1. Results ordering mismatch between languages¶
Das Ergebnis der Abfrage hat in beiden Datenbank-Engines den gleichen Inhalt, aber die Reihenfolge kann unterschiedlich sein, wenn in der Abfrage keine ORDER BY-Klausel definiert ist.
Zugehörige EWIs¶
Keine zugehörigen EWIs.
Äußerer Verknüpfung (Outer Join)¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Ein Outer Join erweitert das Ergebnis einer einfachen Verknüpfung. Ein Outer Join gibt alle Zeilen zurück, die die Join-Bedingung erfüllen und gibt einige oder alle Zeilen aus einer Tabelle zurück, für die keine Zeilen aus der anderen Tabelle die Join-Bedingung erfüllen. (Oracle SQL Language Reference Outer Joins Subsection).
Oracle ANSI-Syntax¶
[ query_partition_clause ] [ NATURAL ]
outer_join_type JOIN table_reference
[ query_partition_clause ]
[ ON condition
| USING ( column [, column ]...)
]
outer_join_type
{ FULL | LEFT | RIGHT } [ OUTER ]
Oracle unterstützt auch den (+)-Operator, der für Outer Joins verwendet werden kann. Dieser Operator wird in der WHERE-Klausel zu einem Spaltenausdruck hinzugefügt.
column_expression (+)
Snowflake ANSI-Syntax¶
Snowflake unterstützt auch die ANSI-Syntax für OUTER JOINS, genau wie Oracle. Die Verhaltensweise bei der Verwendung des (+)-Operators kann jedoch je nach Verwendung unterschiedlich sein. Weitere Informationen zu Snowflake Joins finden Sie hier.
Die Snowflake-Grammatik ist eine der folgenden:
SELECT ...
FROM <object_ref1> [
{
INNER
| { LEFT | RIGHT | FULL } [ OUTER ]
}
]
JOIN <object_ref2>
[ ON <condition> ]
[ ... ]
SELECT *
FROM <object_ref1> [
{
INNER
| { LEFT | RIGHT | FULL } [ OUTER ]
}
]
JOIN <object_ref2>
[ USING( <column_list> ) ]
[ ... ]
SELECT ...
FROM <object_ref1> [
{
| NATURAL [ { LEFT | RIGHT | FULL } [ OUTER ] ]
| CROSS
}
]
JOIN <object_ref2>
[ ... ]
Beispielhafte Quellcode-Muster¶
Bemerkung
ORDER BY-Klausel hinzugefügt, da die Reihenfolge der Ergebnisse zwischen Oracle und Snowflake variieren kann.
Bemerkung
Da die Ergebnismenge zu groß ist, wurde die Zeilenbegrenzungsklausel hinzugefügt. Sie können es entfernen, um das gesamte Resultset abzurufen.
Bemerkung
Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.
Bemerkung
Für die folgenden Beispiele wurden diese Einfügungen und ALTER-Anweisungen ausgeführt, um das Ergebnis für jede Art von JOIN besser unterscheiden zu können:
INSERT INTO hr.regions VALUES (5, 'Oceania');
ALTER TABLE hr.countries DROP CONSTRAINT countr_reg_fk;
INSERT INTO hr.countries VALUES ('--', 'Unknown Country', 0);
1. ANSI syntax¶
Snowflake unterstützt die ANSI-Syntax für SQL JOINS vollständig. Die Verhaltensweise ist für beide Datenbank-Engines identisch.
Linker Outer Join in¶
Oracle¶
SELECT * FROM
hr.countries c
LEFT OUTER JOIN hr.regions r ON c.region_id = r.region_id
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_ID |
REGION_NAME |
|---|---|---|---|---|
– |
Unbekanntes Land |
0 |
||
AR |
Argentinien |
2 |
2 |
Amerika |
AU |
Australien |
3 |
3 |
Asien |
BE |
Belgien |
1 |
1 |
Europa |
BR |
Brasilien |
2 |
2 |
Amerika |
CA |
Kanada |
2 |
2 |
Amerika |
CH |
Schweiz |
1 |
1 |
Europa |
CN |
China |
3 |
3 |
Asien |
DE |
Deutschland |
1 |
1 |
Europa |
DK |
Dänemark |
1 |
1 |
Europa |
Snowflake¶
SELECT * FROM
hr.countries c
LEFT OUTER JOIN
hr.regions r ON c.region_id = r.region_id
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_ID |
REGION_NAME |
|---|---|---|---|---|
– |
Unbekanntes Land |
0.0000000000000000000 |
||
AR |
Argentinien |
2.0000000000000000000 |
2.0000000000000000000 |
Amerika |
AU |
Australien |
3.0000000000000000000 |
3.0000000000000000000 |
Asien |
BE |
Belgien |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
BR |
Brasilien |
2.0000000000000000000 |
2.0000000000000000000 |
Amerika |
CA |
Kanada |
2.0000000000000000000 |
2.0000000000000000000 |
Amerika |
CH |
Schweiz |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
CN |
China |
3.0000000000000000000 |
3.0000000000000000000 |
Asien |
DE |
Deutschland |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
DK |
Dänemark |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
Rechter Outer Join in¶
Oracle¶
SELECT * FROM
hr.countries c
RIGHT OUTER JOIN hr.regions r ON c.region_id = r.region_id
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_ID |
REGION_NAME |
|---|---|---|---|---|
– |
5 |
Ozeanien |
||
ZW |
Simbabwe |
4 |
4 |
Naher Osten und Afrika |
ZM |
Sambia |
4 |
4 |
Naher Osten und Afrika |
US |
Vereinigte Staaten von Amerika |
2 |
2 |
Amerika |
UK |
Großbritannien |
1 |
1 |
Europa |
SG |
Singapur |
3 |
3 |
Asien |
NL |
Niederlande |
1 |
1 |
Europa |
NG |
Nigeria |
4 |
4 |
Naher Osten und Afrika |
MX |
Mexiko |
2 |
2 |
Amerika |
ML |
Malaysia |
3 |
3 |
Asien |
Snowflake¶
SELECT * FROM
hr.countries c
RIGHT OUTER JOIN
hr.regions r ON c.region_id = r.region_id
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_ID |
REGION_NAME |
|---|---|---|---|---|
– |
5.0000000000000000000 |
Ozeanien |
||
ZW |
Simbabwe |
4.0000000000000000000 |
4.0000000000000000000 |
Naher Osten und Afrika |
ZM |
Sambia |
4.0000000000000000000 |
4.0000000000000000000 |
Naher Osten und Afrika |
US |
Vereinigte Staaten von Amerika |
2.0000000000000000000 |
2.0000000000000000000 |
Amerika |
UK |
Großbritannien |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
SG |
Singapur |
3.0000000000000000000 |
3.0000000000000000000 |
Asien |
NL |
Niederlande |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
NG |
Nigeria |
4.0000000000000000000 |
4.0000000000000000000 |
Naher Osten und Afrika |
MX |
Mexiko |
2.0000000000000000000 |
2.0000000000000000000 |
Amerika |
ML |
Malaysia |
3.0000000000000000000 |
3.0000000000000000000 |
Asien |
Vollständiger Outer Join in¶
Oracle¶
SELECT * FROM
hr.countries c
FULL OUTER JOIN hr.regions r ON c.region_id = r.region_id
ORDER BY r.region_name DESC, c.country_id
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_ID |
REGION_NAME |
|---|---|---|---|---|
– |
Unbekanntes Land |
0 |
||
– |
5 |
Ozeanien |
||
EG |
Ägypten |
4 |
4 |
Naher Osten und Afrika |
IL |
Israel |
4 |
4 |
Naher Osten und Afrika |
KW |
Kuwait |
4 |
4 |
Naher Osten und Afrika |
NG |
Nigeria |
4 |
4 |
Naher Osten und Afrika |
ZM |
Sambia |
4 |
4 |
Naher Osten und Afrika |
ZW |
Simbabwe |
4 |
4 |
Naher Osten und Afrika |
BE |
Belgien |
1 |
1 |
Europa |
CH |
Schweiz |
1 |
1 |
Europa |
Snowflake¶
SELECT * FROM
hr.countries c
FULL OUTER JOIN
hr.regions r ON c.region_id = r.region_id
ORDER BY r.region_name DESC, c.country_id
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_ID |
REGION_NAME |
|---|---|---|---|---|
– |
Unbekanntes Land |
0.0000000000000000000 |
||
– |
5.0000000000000000000 |
Ozeanien |
||
EG |
Ägypten |
4.0000000000000000000 |
4.0000000000000000000 |
Naher Osten und Afrika |
IL |
Israel |
4.0000000000000000000 |
4.0000000000000000000 |
Naher Osten und Afrika |
KW |
Kuwait |
4.0000000000000000000 |
4.0000000000000000000 |
Naher Osten und Afrika |
NG |
Nigeria |
4.0000000000000000000 |
4.0000000000000000000 |
Naher Osten und Afrika |
ZM |
Sambia |
4.0000000000000000000 |
4.0000000000000000000 |
Naher Osten und Afrika |
ZW |
Simbabwe |
4.0000000000000000000 |
4.0000000000000000000 |
Naher Osten und Afrika |
BE |
Belgien |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
CH |
Schweiz |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
2. Natural Outer Join¶
Sowohl Oracle als auch Snowflake unterstützen den Natural Outer Join und sie verhalten sich gleich.
Ein NATURALJOIN ist identisch mit einem expliziten JOIN für die gemeinsamen Spalten der beiden Tabellen, mit der Ausnahme, dass die gemeinsamen Spalten nur einmal in der Ausgabe enthalten sind. (Eine natürliche Verknüpfung (Natural Join) geht davon aus, dass Spalten mit demselben Namen, aber in verschiedenen Tabellen, entsprechende Daten enthalten.) (Snowflake SQL-Referenz: JOIN)
Natürliche linke äußere Verknüpfung (Natural Left Outer Join)¶
Oracle¶
SELECT * FROM
hr.countries c
NATURAL LEFT OUTER JOIN hr.regions r
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
REGION_ID |
COUNTRY_ID |
COUNTRY_NAME |
REGION_NAME |
|---|---|---|---|
0 |
– |
Unbekanntes Land |
|
2 |
AR |
Argentinien |
Amerika |
3 |
AU |
Australien |
Asien |
1 |
BE |
Belgien |
Europa |
2 |
BR |
Brasilien |
Amerika |
2 |
CA |
Kanada |
Amerika |
1 |
CH |
Schweiz |
Europa |
3 |
CN |
China |
Asien |
1 |
DE |
Deutschland |
Europa |
1 |
DK |
Dänemark |
Europa |
Snowflake¶
SELECT * FROM
hr.countries c
NATURAL LEFT OUTER JOIN
hr.regions r
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
REGION_ID |
COUNTRY_ID |
COUNTRY_NAME |
REGION_NAME |
|---|---|---|---|
0.0000000000000000000 |
– |
Unbekanntes Land |
|
2.0000000000000000000 |
AR |
Argentinien |
Amerika |
3.0000000000000000000 |
AU |
Australien |
Asien |
1.0000000000000000000 |
BE |
Belgien |
Europa |
2.0000000000000000000 |
BR |
Brasilien |
Amerika |
2.0000000000000000000 |
CA |
Kanada |
Amerika |
1.0000000000000000000 |
CH |
Schweiz |
Europa |
3.0000000000000000000 |
CN |
China |
Asien |
1.0000000000000000000 |
DE |
Deutschland |
Europa |
1.0000000000000000000 |
DK |
Dänemark |
Europa |
Natürliche rechte äußere Verknüpfung (Natural Right Outer Join)¶
Oracle¶
SELECT * FROM
hr.countries c
NATURAL RIGHT OUTER JOIN hr.regions r
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
REGION_ID |
COUNTRY_ID |
COUNTRY_NAME |
REGION_NAME |
|---|---|---|---|
5 |
Ozeanien |
||
4 |
ZW |
Simbabwe |
Naher Osten und Afrika |
4 |
ZM |
Sambia |
Naher Osten und Afrika |
2 |
US |
Vereinigte Staaten von Amerika |
Amerika |
1 |
UK |
Großbritannien |
Europa |
3 |
SG |
Singapur |
Asien |
1 |
NL |
Niederlande |
Europa |
4 |
NG |
Nigeria |
Naher Osten und Afrika |
2 |
MX |
Mexiko |
Amerika |
3 |
ML |
Malaysia |
Asien |
Snowflake¶
SELECT * FROM
hr.countries c
NATURAL RIGHT OUTER JOIN
hr.regions r
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
REGION_ID |
COUNTRY_ID |
COUNTRY_NAME |
REGION_NAME |
|---|---|---|---|
5.0000000000000000000 |
Ozeanien |
||
4.0000000000000000000 |
ZW |
Simbabwe |
Naher Osten und Afrika |
4.0000000000000000000 |
ZM |
Sambia |
Naher Osten und Afrika |
2.0000000000000000000 |
US |
Vereinigte Staaten von Amerika |
Amerika |
1.0000000000000000000 |
UK |
Großbritannien |
Europa |
3.0000000000000000000 |
SG |
Singapur |
Asien |
1.0000000000000000000 |
NL |
Niederlande |
Europa |
4.0000000000000000000 |
NG |
Nigeria |
Naher Osten und Afrika |
2.0000000000000000000 |
MX |
Mexiko |
Amerika |
3.0000000000000000000 |
ML |
Malaysia |
Asien |
3. Basic Outer Join with USING¶
Tabellenspalten können mit dem Schlüsselwort USING verbunden werden. Die Ergebnisse sind die gleichen wie bei einem einfachen OUTER JOIN mit dem Schlüsselwort ON.
Linker äußere Verknüpfung mit¶
Oracle¶
SELECT * FROM
hr.countries c
LEFT OUTER JOIN hr.regions r USING (region_id)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
REGION_ID |
COUNTRY_ID |
COUNTRY_NAME |
REGION_NAME |
|---|---|---|---|
0 |
– |
Unbekanntes Land |
|
2 |
AR |
Argentinien |
Amerika |
3 |
AU |
Australien |
Asien |
1 |
BE |
Belgien |
Europa |
2 |
BR |
Brasilien |
Amerika |
2 |
CA |
Kanada |
Amerika |
1 |
CH |
Schweiz |
Europa |
3 |
CN |
China |
Asien |
1 |
DE |
Deutschland |
Europa |
1 |
DK |
Dänemark |
Europa |
Snowflake¶
SELECT * FROM
hr.countries c
LEFT OUTER JOIN
hr.regions r USING (region_id)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
REGION_ID |
COUNTRY_ID |
COUNTRY_NAME |
REGION_NAME |
|---|---|---|---|
0.0000000000000000000 |
– |
Unbekanntes Land |
|
2.0000000000000000000 |
AR |
Argentinien |
Amerika |
3.0000000000000000000 |
AU |
Australien |
Asien |
1.0000000000000000000 |
BE |
Belgien |
Europa |
2.0000000000000000000 |
BR |
Brasilien |
Amerika |
2.0000000000000000000 |
CA |
Kanada |
Amerika |
1.0000000000000000000 |
CH |
Schweiz |
Europa |
3.0000000000000000000 |
CN |
China |
Asien |
1.0000000000000000000 |
DE |
Deutschland |
Europa |
1.0000000000000000000 |
DK |
Dänemark |
Europa |
4. (+) Operator¶
Oracle und Snowflake haben einen (+)-Operator, der auch für äußere Verknüpfungen verwendet werden kann. In manchen Fällen kann Snowflake bei Verwendung dieses Operators nicht richtig funktionieren.
Weitere Informationen zu diesem Anbieter in Snowflake finden Sie hier.
Linke äußere Verknüpfung mit (+) Operator¶
Oracle¶
SELECT * FROM hr.countries c, hr.regions r
WHERE c.region_id = r.region_id(+)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_ID |
REGION_NAME |
|---|---|---|---|---|
– |
Unbekanntes Land |
0 |
||
AR |
Argentinien |
2 |
2 |
Amerika |
AU |
Australien |
3 |
3 |
Asien |
BE |
Belgien |
1 |
1 |
Europa |
BR |
Brasilien |
2 |
2 |
Amerika |
CA |
Kanada |
2 |
2 |
Amerika |
CH |
Schweiz |
1 |
1 |
Europa |
CN |
China |
3 |
3 |
Asien |
DE |
Deutschland |
1 |
1 |
Europa |
DK |
Dänemark |
1 |
1 |
Europa |
Snowflake¶
SELECT * FROM
hr.countries c,
hr.regions r
WHERE c.region_id = r.region_id(+)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_ID |
REGION_NAME |
|---|---|---|---|---|
– |
Unbekanntes Land |
0.0000000000000000000 |
||
AR |
Argentinien |
2.0000000000000000000 |
2.0000000000000000000 |
Amerika |
AU |
Australien |
3.0000000000000000000 |
3.0000000000000000000 |
Asien |
BE |
Belgien |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
BR |
Brasilien |
2.0000000000000000000 |
2.0000000000000000000 |
Amerika |
CA |
Kanada |
2.0000000000000000000 |
2.0000000000000000000 |
Amerika |
CH |
Schweiz |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
CN |
China |
3.0000000000000000000 |
3.0000000000000000000 |
Asien |
DE |
Deutschland |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
DK |
Dänemark |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
Rechte äußere Verknüpfung mit (+) Operator¶
Oracle¶
SELECT * FROM hr.countries c, hr.regions r
WHERE c.region_id (+) = r.region_id
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_ID |
REGION_NAME |
|---|---|---|---|---|
– |
5 |
Ozeanien |
||
ZW |
Simbabwe |
4 |
4 |
Naher Osten und Afrika |
ZM |
Sambia |
4 |
4 |
Naher Osten und Afrika |
US |
Vereinigte Staaten von Amerika |
2 |
2 |
Amerika |
UK |
Großbritannien |
1 |
1 |
Europa |
SG |
Singapur |
3 |
3 |
Asien |
NL |
Niederlande |
1 |
1 |
Europa |
NG |
Nigeria |
4 |
4 |
Naher Osten und Afrika |
MX |
Mexiko |
2 |
2 |
Amerika |
ML |
Malaysia |
3 |
3 |
Asien |
Snowflake¶
SELECT * FROM
hr.countries c,
hr.regions r
WHERE c.region_id (+) = r.region_id
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_ID |
REGION_NAME |
|---|---|---|---|---|
– |
5.0000000000000000000 |
Ozeanien |
||
ZW |
Simbabwe |
4.0000000000000000000 |
4.0000000000000000000 |
Naher Osten und Afrika |
ZM |
Sambia |
4.0000000000000000000 |
4.0000000000000000000 |
Naher Osten und Afrika |
US |
Vereinigte Staaten von Amerika |
2.0000000000000000000 |
2.0000000000000000000 |
Amerika |
UK |
Großbritannien |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
SG |
Singapur |
3.0000000000000000000 |
3.0000000000000000000 |
Asien |
NL |
Niederlande |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
NG |
Nigeria |
4.0000000000000000000 |
4.0000000000000000000 |
Naher Osten und Afrika |
MX |
Mexiko |
2.0000000000000000000 |
2.0000000000000000000 |
Amerika |
ML |
Malaysia |
3.0000000000000000000 |
3.0000000000000000000 |
Asien |
Einzelne Tabelle verbunden mit mehreren Tabellen mit (+)¶
In Oracle können Sie mit dem Operator (+) eine einzelne Tabelle mit mehreren Tabellen verbinden. Snowflake unterstützt dies jedoch nicht. Abfragen mit dieser Art von äußeren Verknüpfungen werden in die ANSI-Syntax geändert.
Oracle¶
SELECT
c.country_id,
c.country_name,
r.region_id,
r.region_name,
l.location_id,
l.street_address,
l.postal_code,
l.city
FROM
hr.countries c, hr.regions r, hr.locations l
WHERE
c.region_id(+) = r.region_id AND
l.country_id = c.country_id(+)
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_NAME |
LOCATION_ID |
STREET_ADDRESS |
POSTAL_CODE |
CITY |
|---|---|---|---|---|---|---|---|
1 |
Europa |
2000 |
40-5-12 Laogianggen |
190518 |
Beijing |
||
CH |
Schweiz |
1 |
Europa |
3000 |
Murtenstrasse 921 |
3095 |
Bern |
1 |
Europa |
2100 |
1298 Vileparle (E) |
490231 |
Mumbai |
||
CH |
Schweiz |
1 |
Europa |
2900 |
20 Rue des Corps-Saints |
1730 |
Genf |
1 |
Europa |
1300 |
9450 Kamiya-cho |
6823 |
Hiroshima |
||
UK |
Großbritannien |
1 |
Europa |
2400 |
8204 Arthur St |
London |
|
1 |
Europa |
3200 |
Mariano Escobedo 9991 |
11932 |
Mexiko-Stadt |
||
DE |
Deutschland |
1 |
Europa |
2700 |
Schwanthalerstr. 7031 |
80925 |
München |
UK |
Großbritannien |
1 |
Europa |
2500 |
Magdalen Centre, The Oxford Science Park |
OX9-9ZB |
Oxford |
IT |
Italien |
1 |
Europa |
1000 |
1297 Via Cola di Rie |
00989 |
Rom |
Snowflake¶
SELECT
c.country_id,
c.country_name,
r.region_id,
r.region_name,
l.location_id,
l.street_address,
l.postal_code,
l.city
FROM
hr.regions r
CROSS JOIN hr.locations l
LEFT OUTER JOIN
hr.countries c
ON
c.region_id = r.region_id
AND
l.country_id = c.country_id
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_NAME |
LOCATION_ID |
STREET_ADDRESS |
POSTAL_CODE |
CITY |
|---|---|---|---|---|---|---|---|
1.0000000000000000000 |
Europa |
2000 |
40-5-12 Laogianggen |
190518 |
Beijing |
||
CH |
Schweiz |
1.0000000000000000000 |
Europa |
3000 |
Murtenstrasse 921 |
3095 |
Bern |
1.0000000000000000000 |
Europa |
2100 |
1298 Vileparle (E) |
490231 |
Mumbai |
||
CH |
Schweiz |
1.0000000000000000000 |
Europa |
2900 |
20 Rue des Corps-Saints |
1730 |
Genf |
1.0000000000000000000 |
Europa |
1300 |
9450 Kamiya-cho |
6823 |
Hiroshima |
||
UK |
Großbritannien |
1.0000000000000000000 |
Europa |
2400 |
8204 Arthur St |
London |
|
1.0000000000000000000 |
Europa |
3200 |
Mariano Escobedo 9991 |
11932 |
Mexiko-Stadt |
||
DE |
Deutschland |
1.0000000000000000000 |
Europa |
2700 |
Schwanthalerstr. 7031 |
80925 |
München |
UK |
Großbritannien |
1.0000000000000000000 |
Europa |
2500 |
Magdalen Centre, The Oxford Science Park |
OX9-9ZB |
Oxford |
IT |
Italien |
1.0000000000000000000 |
Europa |
1000 |
1297 Via Cola di Rie |
00989 |
Rom |
Verwendung des (+)-Operators mit einer Spalte aus einer nicht verknüpften Tabelle und einem Nicht-Spaltenwert¶
In Oracle können Sie den Operator (+) mit einer Spalte verwenden und diese mit einem Wert verknüpfen, der keine Spalte aus einer anderen Tabelle ist. Snowflake kann dies auch tun, aber es schlägt fehl, wenn die Tabelle der Spalte nicht mit einer anderen Tabelle verbunden wurde. Um dieses Problem zu lösen, wird der (+)-Operator aus der Abfrage entfernt, wenn dieses Szenario eintritt, und das Ergebnis ist dasselbe wie in Oracle.
Oracle¶
SELECT * FROM hr.regions r
WHERE
r.region_name (+) LIKE 'A%'
ORDER BY region_id;
Ergebnis¶
REGION_ID |
REGION_NAME |
|---|---|
2 |
Amerika |
3 |
Asien |
Snowflake¶
SELECT * FROM
hr.regions r
WHERE
r.region_name LIKE 'A%'
ORDER BY region_id;
Ergebnis¶
REGION_ID |
REGION_NAME |
|---|---|
2.0000000000000000000 |
Amerika |
3.0000000000000000000 |
Asien |
Bekannte Probleme¶
Für alle nicht unterstützten Fälle sehen Sie bitte unter EWIs nach, um Empfehlungen und mögliche Umgehungen zu erhalten.
1. Converted Outer Joins to ANSI syntax might reorder de columns¶
Wenn eine Abfrage mit einer nicht-ANSI-konformen äußeren Verknüpfung in eine ANSI-konformen äußere Verknüpfung konvertiert wird, kann sich die Reihenfolge der Spalten in der konvertierten Abfrage ändern. Um dieses Problem zu beheben, versuchen Sie, die Spalten in der gewünschten Reihenfolge auszuwählen.
Oracle¶
SELECT
*
FROM
hr.countries c, hr.regions r, hr.locations l
WHERE
c.region_id(+) = r.region_id AND
l.country_id = c.country_id(+)
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_ID |
REGION_NAME |
LOCATION_ID |
STREET_ADDRESS |
POSTAL_CODE |
CITY |
STATE_PROVINCE |
COUNTRY_ID |
|---|---|---|---|---|---|---|---|---|---|---|
1 |
Europa |
2000 |
40-5-12 Laogianggen |
190518 |
Beijing |
CN |
||||
CH |
Schweiz |
1 |
1 |
Europa |
3000 |
Murtenstrasse 921 |
3095 |
Bern |
BE |
CH |
1 |
Europa |
2100 |
1298 Vileparle (E) |
490231 |
Mumbai |
Maharashtra |
IN |
|||
CH |
Schweiz |
1 |
1 |
Europa |
2900 |
20 Rue des Corps-Saints |
1730 |
Genf |
Genf |
CH |
1 |
Europa |
1300 |
9450 Kamiya-cho |
6823 |
Hiroshima |
JP |
||||
UK |
Großbritannien |
1 |
1 |
Europa |
2400 |
8204 Arthur St |
London |
UK |
||
1 |
Europa |
3200 |
Mariano Escobedo 9991 |
11932 |
Mexiko-Stadt |
Distrito Federal, |
MX |
|||
DE |
Deutschland |
1 |
1 |
Europa |
2700 |
Schwanthalerstr. 7031 |
80925 |
München |
Bayern |
DE |
UK |
Großbritannien |
1 |
1 |
Europa |
2500 |
Magdalen Centre, The Oxford Science Park |
OX9-9ZB |
Oxford |
Oxford |
UK |
IT |
Italien |
1 |
1 |
Europa |
1000 |
1297 Via Cola di Rie |
00989 |
Rom |
IT |
Snowflake¶
SELECT
*
FROM
hr.regions r
CROSS JOIN hr.locations l
LEFT OUTER JOIN
hr.countries c
ON
c.region_id = r.region_id
AND
l.country_id = c.country_id
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
REGION_ID |
REGION_NAME |
LOCATION_ID |
STREET_ADDRESS |
POSTAL_CODE |
CITY |
STATE_PROVINCE |
COUNTRY_ID |
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
|---|---|---|---|---|---|---|---|---|---|---|
1.0000000000000000000 |
Europa |
2000 |
40-5-12 Laogianggen |
190518 |
Beijing |
CN |
||||
1.0000000000000000000 |
Europa |
3000 |
Murtenstrasse 921 |
3095 |
Bern |
BE |
CH |
CH |
Schweiz |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
2100 |
1298 Vileparle (E) |
490231 |
Mumbai |
Maharashtra |
IN |
|||
1.0000000000000000000 |
Europa |
2900 |
20 Rue des Corps-Saints |
1730 |
Genf |
Genf |
CH |
CH |
Schweiz |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
1300 |
9450 Kamiya-cho |
6823 |
Hiroshima |
JP |
||||
1.0000000000000000000 |
Europa |
2400 |
8204 Arthur St |
London |
UK |
UK |
Großbritannien |
1.0000000000000000000 |
||
1.0000000000000000000 |
Europa |
3200 |
Mariano Escobedo 9991 |
11932 |
Mexiko-Stadt |
Distrito Federal, |
MX |
|||
1.0000000000000000000 |
Europa |
2700 |
Schwanthalerstr. 7031 |
80925 |
München |
Bayern |
DE |
DE |
Deutschland |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
2500 |
Magdalen Centre, The Oxford Science Park |
OX9-9ZB |
Oxford |
Oxford |
UK |
UK |
Großbritannien |
1.0000000000000000000 |
1.0000000000000000000 |
Europa |
1000 |
1297 Via Cola di Rie |
00989 |
Rom |
IT |
IT |
Italien |
1.0000000000000000000 |
2. Outer joined between predicate with an interval with multiple tables¶
Between-Prädikate können für nicht-ANSI OUTER JOINS verwendet werden. In Oracle können Spalten innerhalb des Intervalls mit einer äußeren Verknüpfung werden, auch wenn sie aus verschiedenen Tabellen stammen. Snowflake unterstützt dies jedoch nicht. In diesen Fällen wird das Prädikat BETWEEN auskommentiert.
Oracle¶
SELECT
*
FROM
hr.countries c, hr.regions r, hr.locations l WHERE
l.location_id BETWEEN r.region_id(+) AND c.region_id(+)
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Ergebnis¶
COUNTRY_ID |
COUNTRY_NAME |
REGION_ID |
REGION_ID |
REGION_NAME |
LOCATION_ID |
STREET_ADDRESS |
POSTAL_CODE |
CITY |
STATE_PROVINCE |
COUNTRY_ID |
|---|---|---|---|---|---|---|---|---|---|---|
1 |
Europa |
2000 |
40-5-12 Laogianggen |
190518 |
Beijing |
CN |
||||
1 |
Europa |
3000 |
Murtenstrasse 921 |
3095 |
Bern |
BE |
CH |
|||
1 |
Europa |
2100 |
1298 Vileparle (E) |
490231 |
Mumbai |
Maharashtra |
IN |
|||
1 |
Europa |
2900 |
20 Rue des Corps-Saints |
1730 |
Genf |
Genf |
CH |
|||
1 |
Europa |
1300 |
9450 Kamiya-cho |
6823 |
Hiroshima |
JP |
||||
1 |
Europa |
2400 |
8204 Arthur St |
London |
UK |
|||||
1 |
Europa |
3200 |
Mariano Escobedo 9991 |
11932 |
Mexiko-Stadt |
Distrito Federal, |
MX |
|||
1 |
Europa |
2700 |
Schwanthalerstr. 7031 |
80925 |
München |
Bayern |
DE |
|||
1 |
Europa |
2500 |
Magdalen Centre, The Oxford Science Park |
OX9-9ZB |
Oxford |
Oxford |
UK |
|||
1 |
Europa |
1000 |
1297 Via Cola di Rie |
00989 |
Rom |
IT |
Snowflake¶
SELECT
*
FROM
hr.countries c,
hr.regions r,
hr.locations l WHERE
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0090 - INVALID NON-ANSI OUTER JOIN BETWEEN PREDICATE CASE FOR SNOWFLAKE. ***/!!!
l.location_id BETWEEN r.region_id(+) AND c.region_id(+)
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Zugehörige EWIs¶
SSC-EWI-OR0090: Nicht-ANSI Outer Join hat ein ungültiges Between-Prädikat.
Selbstverknüpfung (Self Join)¶
Bemerkung
Einige Teile in den Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Ein Self-Join ist eine Verknüpfung einer Tabelle mit sich selbst. Diese Tabelle erscheint zweimal in der
FROM-Klausel und wird von Tabellenaliasen gefolgt, die Spaltennamen in der Join-Bedingung qualifizieren. (Oracle SQL Language Reference Self Join Subsection)
Beispielhafte Quellcode-Muster¶
Bemerkung
ORDER BY-Klausel hinzugefügt, da die Reihenfolge der Ergebnisse zwischen Oracle und Snowflake variieren kann.
Bemerkung
Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.
Grundlegender Self-Join-Fall¶
Oracle¶
SELECT e1.last_name||' works for '||e2.last_name
"Employees and Their Managers"
FROM hr.employees e1, hr.employees e2
WHERE e1.manager_id = e2.employee_id
AND e1.last_name LIKE 'R%'
ORDER BY e1.last_name;
Ergebnis¶
Mitarbeiter und ihre Vorgesetzten |
|---|
Rajs arbeitet für Mourgos |
Raphaely arbeitet für King |
Rogers arbeitet für Kaufling |
Russell arbeitet für King |
Snowflake¶
SELECT
NVL( e1.last_name :: STRING, '') || ' works for ' || NVL(e2.last_name :: STRING, '') "Employees and Their Managers"
FROM
hr.employees e1,
hr.employees e2
WHERE e1.manager_id = e2.employee_id
AND e1.last_name LIKE 'R%'
ORDER BY e1.last_name;
Ergebnis¶
Mitarbeiter und ihre Vorgesetzten |
|---|
Rajs arbeitet für Mourgos |
Raphaely arbeitet für King |
Rogers arbeitet für Kaufling |
Russell arbeitet für King |
Bemerkung
Wie bereits bewiesen, ist die Selbstverknüpfung (Self Join) in Oracle funktional gleichwertig mit Snowflake.
Bekannte Probleme¶
Es wurden keine Probleme gefunden.
Zugehörige EWIs¶
Keine zugehörigen EWIs.
Semijoin¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Ein Semijoin gibt Zeilen zurück, die einer
EXISTSUnterabfrage entsprechen, ohne Zeilen von der linken Seite des Prädikats zu duplizieren, wenn mehrere Zeilen auf der rechten Seite die Kriterien der Unterabfrage erfüllen. Die Semijoin-Transformation kann nicht durchgeführt werden, wenn sich die Unterabfrage auf einemOR-Zweig derWHERE-Klausel befindet. (Oracle SQL Language Reference Semijoin Subsection)
Beispielhafte Quellcode-Muster¶
Bemerkung
ORDER BY-Klausel hinzugefügt, da die Reihenfolge der Ergebnisse zwischen Oracle und Snowflake variieren kann.
Bemerkung
Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.
Grundlegender Semijoin-Fall¶
Oracle¶
SELECT * FROM hr.departments
WHERE EXISTS
(SELECT * FROM hr.employees
WHERE departments.department_id = employees.department_id
AND employees.salary > 2500)
ORDER BY department_name;
Ergebnis¶
DEPARTMENT_ID |
DEPARTMENT_NAME |
MANAGER_ID |
LOCATION_ID |
|---|---|---|---|
110 |
Buchhaltung |
205 |
1700 |
10 |
Administration |
200 |
1700 |
90 |
Executive |
100 |
1700 |
100 |
Finanzen |
108 |
1700 |
40 |
Human Resources |
203 |
2400 |
60 |
IT |
103 |
1400 |
20 |
Marketing |
201 |
1800 |
70 |
Public Relations |
204 |
2700 |
30 |
Purchasing |
114 |
1700 |
80 |
Sales |
145 |
2500 |
50 |
Versand |
121 |
1500 |
Snowflake¶
SELECT * FROM
hr.departments
WHERE EXISTS
(SELECT * FROM
hr.employees
WHERE departments.department_id = employees.department_id
AND employees.salary > 2500)
ORDER BY department_name;
Ergebnis¶
DEPARTMENT_ID |
DEPARTMENT_NAME |
MANAGER_ID |
LOCATION_ID |
|---|---|---|---|
110 |
Buchhaltung |
205 |
1700 |
10 |
Administration |
200 |
1700 |
90 |
Executive |
100 |
1700 |
100 |
Finanzen |
108 |
1700 |
40 |
Human Resources |
203 |
2400 |
60 |
IT |
103 |
1400 |
20 |
Marketing |
201 |
1800 |
70 |
Public Relations |
204 |
2700 |
30 |
Purchasing |
114 |
1700 |
80 |
Sales |
145 |
2500 |
50 |
Versand |
121 |
1500 |
Bemerkung
Wie bereits bewiesen, ist der Semijoin in Oracle funktional äquivalent zu Snowflake.
Bekannte Probleme¶
Es wurden keine Probleme gefunden.
Zugehörige EWIs¶
Keine zugehörigen EWIs.