SnowConvert: 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)
Hier finden Sie die Artikel in diesem Abschnitt:
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 der WHERE
-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
Lesen Sie diesen Abschnitt 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;
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;
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;
DEPARTMENT_ID|DEPARTMENT_NAME |
-------------+--------------------+
120|Treasury |
130|Corporate Tax |
140|Control And Credit |
150|Shareholder Services|
160|Benefits |
170|Manufacturing |
180|Construction |
190|Contracting |
200|Operations |
210|IT Support |
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;
DEPARTMENT_ID|DEPARTMENT_NAME |
-------------+--------------------+
120|Treasury |
130|Corporate Tax |
140|Control And Credit |
150|Shareholder Services|
160|Benefits |
170|Manufacturing |
180|Construction |
190|Contracting |
200|Operations |
210|IT Support |
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
Lesen Sie diesen Abschnitt 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
SALARY COMPARISON |
---------------------------------------------------------------+
Abel has salary between 100 less and 100 more than Abel |
Abel has salary between 100 less and 100 more than Cambrault |
Abel has salary between 100 less and 100 more than Raphaely |
Ande has salary between 100 less and 100 more than Ande |
Ande has salary between 100 less and 100 more than Mavris |
Ande has salary between 100 less and 100 more than Vollman |
Atkinson has salary between 100 less and 100 more than Atkinson|
Atkinson has salary between 100 less and 100 more than Baida |
Atkinson has salary between 100 less and 100 more than Gates |
Atkinson has salary between 100 less and 100 more than 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;
SALARY COMPARISON |
---------------------------------------------------------------+
Abel has salary between 100 less and 100 more than Abel |
Abel has salary between 100 less and 100 more than Cambrault |
Abel has salary between 100 less and 100 more than Raphaely |
Ande has salary between 100 less and 100 more than Ande |
Ande has salary between 100 less and 100 more than Mavris |
Ande has salary between 100 less and 100 more than Vollman |
Atkinson has salary between 100 less and 100 more than Atkinson|
Atkinson has salary between 100 less and 100 more than Baida |
Atkinson has salary between 100 less and 100 more than Gates |
Atkinson has salary between 100 less and 100 more than Geoni |
Warnung
Die Migration einiger SELECT
-Anweisungen ohne die entsprechenden Tabellen könnte die [SSC-EWI-OR0036](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/oracleEWI. md#ssc-ewi-or0036) erzeugen: Probleme bei der Typenauflösung. Um diese Warnung zu vermeiden, fügen Sie CREATE TABLE
in die 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](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/oracleEWI. md#ssc-ewi-or0036)[:](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/oracleEWI. md#ssc-ewi-or0036) Probleme bei der Auflösung von Typen, die arithmetische Operation verhält sich möglicherweise nicht korrekt zwischen Zeichenfolge und Datum.
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
Lesen Sie diesen Abschnitt 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;
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL |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 |Shipping |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 |
|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;
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL |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 |Shipping |121 |1500 |
|121 |Adam |Fripp |AFRIPP|650.123.2234|2005-04-10|ST_MAN|8200.00| |100 |50 |30 |Purchasing |114 |1700 |
|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;
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL |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 |Shipping |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 |
|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
Lesen Sie diesen Abschnitt 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;
|LAST_NAME|JOB_ID |DEPARTMENT_ID|DEPARTMENT_NAME |
|---------|--------|-------------|----------------|
|Abel |SA_REP |80 |Sales |
|Ande |SA_REP |80 |Sales |
|Atkinson |ST_CLERK|50 |Shipping |
|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;
|LAST_NAME|JOB_ID |DEPARTMENT_ID|DEPARTMENT_NAME |
|---------|--------|-------------|----------------|
|Abel |SA_REP |80 |Sales |
|Ande |SA_REP |80 |Sales |
|Atkinson |ST_CLERK|50 |Shipping |
|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
Lesen Sie diesen Abschnitt 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;
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL |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 |Finance |108 |1700 |
|109 |Daniel |Faviet |DFAVIET |515.124.4169|2002-08-16 00:00:00.000|FI_ACCOUNT|9000 | |108 |100 |100 |Finance |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;
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL |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 |Finance |108 |1700 |
|109 |Daniel |Faviet |DFAVIET |515.124.4169|2002-08-16|FI_ACCOUNT|9000.00 | |108 |100 |100 |Finance |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;
|DEPARTMENT_ID|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL |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 |Finance |108 |1700 |
|100 |109 |Daniel |Faviet |DFAVIET |515.124.4169|2002-08-16 00:00:00.000|FI_ACCOUNT|9000 | |108 |Finance |108 |1700 |
Snowflake¶
SELECT
*
FROM
hr.employees
INNER JOIN
hr.departments
USING(department_id)
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
|DEPARTMENT_ID|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL |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 |Finance |108 |1700 |
|100 |109 |Daniel |Faviet |DFAVIET |515.124.4169|2002-08-16|FI_ACCOUNT|9000.00 | |108 |Finance |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;
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL |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 |Accounting |205 |1700 |
|101 |Neena |Kochhar |NKOCHHAR|515.123.4568|2005-09-21 00:00:00.000|AD_VP |17000 | |100 |90 |110 |Accounting |205 |1700 |
|102 |Lex |De Haan |LDEHAAN |515.123.4569|2001-01-13 00:00:00.000|AD_VP |17000 | |100 |90 |110 |Accounting |205 |1700 |
|103 |Alexander |Hunold |AHUNOLD |590.423.4567|2006-01-03 00:00:00.000|IT_PROG |9000 | |102 |60 |110 |Accounting |205 |1700 |
|104 |Bruce |Ernst |BERNST |590.423.4568|2007-05-21 00:00:00.000|IT_PROG |6000 | |103 |60 |110 |Accounting |205 |1700 |
|105 |David |Austin |DAUSTIN |590.423.4569|2005-06-25 00:00:00.000|IT_PROG |4800 | |103 |60 |110 |Accounting |205 |1700 |
|106 |Valli |Pataballa|VPATABAL|590.423.4560|2006-02-05 00:00:00.000|IT_PROG |4800 | |103 |60 |110 |Accounting |205 |1700 |
|107 |Diana |Lorentz |DLORENTZ|590.423.5567|2007-02-07 00:00:00.000|IT_PROG |4200 | |103 |60 |110 |Accounting |205 |1700 |
|108 |Nancy |Greenberg|NGREENBE|515.124.4569|2002-08-17 00:00:00.000|FI_MGR |12008 | |101 |100 |110 |Accounting |205 |1700 |
|109 |Daniel |Faviet |DFAVIET |515.124.4169|2002-08-16 00:00:00.000|FI_ACCOUNT|9000 | |108 |100 |110 |Accounting |205 |1700 |
Snowflake¶
SELECT
*
FROM
hr.employees
CROSS JOIN hr.departments
ORDER BY department_name, employee_id
FETCH NEXT 10 ROWS ONLY;
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL |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 |Accounting |205 |1700 |
|101 |Neena |Kochhar |NKOCHHAR|515.123.4568|2005-09-21|AD_VP |17000.00| |100 |90 |110 |Accounting |205 |1700 |
|102 |Lex |De Haan |LDEHAAN |515.123.4569|2001-01-13|AD_VP |17000.00| |100 |90 |110 |Accounting |205 |1700 |
|103 |Alexander |Hunold |AHUNOLD |590.423.4567|2006-01-03|IT_PROG |9000.00 | |102 |60 |110 |Accounting |205 |1700 |
|104 |Bruce |Ernst |BERNST |590.423.4568|2007-05-21|IT_PROG |6000.00 | |103 |60 |110 |Accounting |205 |1700 |
|105 |David |Austin |DAUSTIN |590.423.4569|2005-06-25|IT_PROG |4800.00 | |103 |60 |110 |Accounting |205 |1700 |
|106 |Valli |Pataballa|VPATABAL|590.423.4560|2006-02-05|IT_PROG |4800.00 | |103 |60 |110 |Accounting |205 |1700 |
|107 |Diana |Lorentz |DLORENTZ|590.423.5567|2007-02-07|IT_PROG |4200.00 | |103 |60 |110 |Accounting |205 |1700 |
|108 |Nancy |Greenberg|NGREENBE|515.124.4569|2002-08-17|FI_MGR |12008.00| |101 |100 |110 |Accounting |205 |1700 |
|109 |Daniel |Faviet |DFAVIET |515.124.4169|2002-08-16|FI_ACCOUNT|9000.00 | |108 |100 |110 |Accounting |205 |1700 |
Natural Inner Join¶
Oracle¶
SELECT
*
FROM
hr.employees
NATURAL JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
|MANAGER_ID|DEPARTMENT_ID|EMPLOYEE_ID|FIRST_NAME |LAST_NAME|EMAIL |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 | |Finance |1700 |
|108 |100 |110 |John |Chen |JCHEN |515.124.4269|2005-09-28 00:00:00.000|FI_ACCOUNT|8200 | |Finance |1700 |
|108 |100 |111 |Ismael |Sciarra |ISCIARRA|515.124.4369|2005-09-30 00:00:00.000|FI_ACCOUNT|7700 | |Finance |1700 |
|108 |100 |112 |Jose Manuel|Urman |JMURMAN |515.124.4469|2006-03-07 00:00:00.000|FI_ACCOUNT|7800 | |Finance |1700 |
Snowflake¶
SELECT
*
FROM
hr.employees
NATURAL JOIN
hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
|MANAGER_ID|DEPARTMENT_ID|EMPLOYEE_ID|FIRST_NAME |LAST_NAME|EMAIL |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 | |Finance |1700 |
|108 |100 |110 |John |Chen |JCHEN |515.124.4269|2005-09-28|FI_ACCOUNT|8200.00 | |Finance |1700 |
|108 |100 |111 |Ismael |Sciarra |ISCIARRA|515.124.4369|2005-09-30|FI_ACCOUNT|7700.00 | |Finance |1700 |
|108 |100 |112 |Jose Manuel|Urman |JMURMAN |515.124.4469|2006-03-07|FI_ACCOUNT|7800.00 | |Finance |1700 |
Cross Natural Join¶
Oracle¶
SELECT
*
FROM
hr.employees
CROSS NATURAL JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
|MANAGER_ID|DEPARTMENT_ID|EMPLOYEE_ID|FIRST_NAME |LAST_NAME|EMAIL |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 | |Finance |1700 |
|108 |100 |110 |John |Chen |JCHEN |515.124.4269|2005-09-28 00:00:00.000|FI_ACCOUNT|8200 | |Finance |1700 |
|108 |100 |111 |Ismael |Sciarra |ISCIARRA|515.124.4369|2005-09-30 00:00:00.000|FI_ACCOUNT|7700 | |Finance |1700 |
|108 |100 |112 |Jose Manuel|Urman |JMURMAN |515.124.4469|2006-03-07 00:00:00.000|FI_ACCOUNT|7800 | |Finance |1700 |
Snowflake¶
SELECT
*
FROM
hr.employees
NATURAL JOIN
hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
|MANAGER_ID|DEPARTMENT_ID|EMPLOYEE_ID|FIRST_NAME |LAST_NAME|EMAIL |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 | |Finance |1700 |
|108 |100 |110 |John |Chen |JCHEN |515.124.4269|2005-09-28|FI_ACCOUNT|8200.00 | |Finance |1700 |
|108 |100 |111 |Ismael |Sciarra |ISCIARRA|515.124.4369|2005-09-30|FI_ACCOUNT|7700.00 | |Finance |1700 |
|108 |100 |112 |Jose Manuel|Urman |JMURMAN |515.124.4469|2006-03-07|FI_ACCOUNT|7800.00 | |Finance |1700 |
Natural Cross Join¶
Oracle¶
SELECT
*
FROM
hr.employees
NATURAL CROSS JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL|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 |Finance |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 |Shipping |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;
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL|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 |Finance |108 |1700 |
|100 |Steven |King |SKING|515.123.4567|2003-06-17|AD_PRES|24000.00| | |90 |50 |Shipping |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
Lesen Sie diesen Abschnitt 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;
COUNTRY_ID|COUNTRY_NAME |REGION_ID|REGION_ID|REGION_NAME|
----------+---------------+---------+---------+-----------+
-- |Unknown Country| 0| | |
AR |Argentina | 2| 2|Americas |
AU |Australia | 3| 3|Asia |
BE |Belgium | 1| 1|Europe |
BR |Brazil | 2| 2|Americas |
CA |Canada | 2| 2|Americas |
CH |Switzerland | 1| 1|Europe |
CN |China | 3| 3|Asia |
DE |Germany | 1| 1|Europe |
DK |Denmark | 1| 1|Europe |
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;
COUNTRY_ID|COUNTRY_NAME |REGION_ID |REGION_ID |REGION_NAME|
----------+---------------+---------------------+---------------------+-----------+
-- |Unknown Country|0.0000000000000000000| | |
AR |Argentina |2.0000000000000000000|2.0000000000000000000|Americas |
AU |Australia |3.0000000000000000000|3.0000000000000000000|Asia |
BE |Belgium |1.0000000000000000000|1.0000000000000000000|Europe |
BR |Brazil |2.0000000000000000000|2.0000000000000000000|Americas |
CA |Canada |2.0000000000000000000|2.0000000000000000000|Americas |
CH |Switzerland |1.0000000000000000000|1.0000000000000000000|Europe |
CN |China |3.0000000000000000000|3.0000000000000000000|Asia |
DE |Germany |1.0000000000000000000|1.0000000000000000000|Europe |
DK |Denmark |1.0000000000000000000|1.0000000000000000000|Europe |
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;
COUNTRY_ID|COUNTRY_NAME |REGION_ID|REGION_ID|REGION_NAME |
----------+------------------------+---------+---------+----------------------+
| | | 5|Oceania |
ZW |Zimbabwe | 4| 4|Middle East and Africa|
ZM |Zambia | 4| 4|Middle East and Africa|
US |United States of America| 2| 2|Americas |
UK |United Kingdom | 1| 1|Europe |
SG |Singapore | 3| 3|Asia |
NL |Netherlands | 1| 1|Europe |
NG |Nigeria | 4| 4|Middle East and Africa|
MX |Mexico | 2| 2|Americas |
ML |Malaysia | 3| 3|Asia |
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;
COUNTRY_ID|COUNTRY_NAME |REGION_ID |REGION_ID |REGION_NAME |
----------+------------------------+---------------------+---------------------+----------------------+
| | |5.0000000000000000000|Oceania |
ZW |Zimbabwe |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
ZM |Zambia |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
US |United States of America|2.0000000000000000000|2.0000000000000000000|Americas |
UK |United Kingdom |1.0000000000000000000|1.0000000000000000000|Europe |
SG |Singapore |3.0000000000000000000|3.0000000000000000000|Asia |
NL |Netherlands |1.0000000000000000000|1.0000000000000000000|Europe |
NG |Nigeria |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
MX |Mexico |2.0000000000000000000|2.0000000000000000000|Americas |
ML |Malaysia |3.0000000000000000000|3.0000000000000000000|Asia |
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;
COUNTRY_ID|COUNTRY_NAME |REGION_ID|REGION_ID|REGION_NAME |
----------+---------------+---------+---------+----------------------+
-- |Unknown Country| 0| | |
| | | 5|Oceania |
EG |Egypt | 4| 4|Middle East and Africa|
IL |Israel | 4| 4|Middle East and Africa|
KW |Kuwait | 4| 4|Middle East and Africa|
NG |Nigeria | 4| 4|Middle East and Africa|
ZM |Zambia | 4| 4|Middle East and Africa|
ZW |Zimbabwe | 4| 4|Middle East and Africa|
BE |Belgium | 1| 1|Europe |
CH |Switzerland | 1| 1|Europe |
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;
COUNTRY_ID|COUNTRY_NAME |REGION_ID |REGION_ID |REGION_NAME |
----------+---------------+---------------------+---------------------+----------------------+
-- |Unknown Country|0.0000000000000000000| | |
| | |5.0000000000000000000|Oceania |
EG |Egypt |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
IL |Israel |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
KW |Kuwait |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
NG |Nigeria |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
ZM |Zambia |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
ZW |Zimbabwe |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
BE |Belgium |1.0000000000000000000|1.0000000000000000000|Europe |
CH |Switzerland |1.0000000000000000000|1.0000000000000000000|Europe |
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;
REGION_ID|COUNTRY_ID|COUNTRY_NAME |REGION_NAME|
---------+----------+---------------+-----------+
0|-- |Unknown Country| |
2|AR |Argentina |Americas |
3|AU |Australia |Asia |
1|BE |Belgium |Europe |
2|BR |Brazil |Americas |
2|CA |Canada |Americas |
1|CH |Switzerland |Europe |
3|CN |China |Asia |
1|DE |Germany |Europe |
1|DK |Denmark |Europe |
Snowflake¶
SELECT * FROM
hr.countries c
NATURAL LEFT OUTER JOIN
hr.regions r
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
REGION_ID |COUNTRY_ID|COUNTRY_NAME |REGION_NAME|
---------------------+----------+---------------+-----------+
0.0000000000000000000|-- |Unknown Country| |
2.0000000000000000000|AR |Argentina |Americas |
3.0000000000000000000|AU |Australia |Asia |
1.0000000000000000000|BE |Belgium |Europe |
2.0000000000000000000|BR |Brazil |Americas |
2.0000000000000000000|CA |Canada |Americas |
1.0000000000000000000|CH |Switzerland |Europe |
3.0000000000000000000|CN |China |Asia |
1.0000000000000000000|DE |Germany |Europe |
1.0000000000000000000|DK |Denmark |Europe |
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;
REGION_ID|COUNTRY_ID|COUNTRY_NAME |REGION_NAME |
---------+----------+------------------------+----------------------+
5| | |Oceania |
4|ZW |Zimbabwe |Middle East and Africa|
4|ZM |Zambia |Middle East and Africa|
2|US |United States of America|Americas |
1|UK |United Kingdom |Europe |
3|SG |Singapore |Asia |
1|NL |Netherlands |Europe |
4|NG |Nigeria |Middle East and Africa|
2|MX |Mexico |Americas |
3|ML |Malaysia |Asia |
Snowflake¶
SELECT * FROM
hr.countries c
NATURAL RIGHT OUTER JOIN
hr.regions r
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
REGION_ID |COUNTRY_ID|COUNTRY_NAME |REGION_NAME |
---------------------+----------+------------------------+----------------------+
5.0000000000000000000| | |Oceania |
4.0000000000000000000|ZW |Zimbabwe |Middle East and Africa|
4.0000000000000000000|ZM |Zambia |Middle East and Africa|
2.0000000000000000000|US |United States of America|Americas |
1.0000000000000000000|UK |United Kingdom |Europe |
3.0000000000000000000|SG |Singapore |Asia |
1.0000000000000000000|NL |Netherlands |Europe |
4.0000000000000000000|NG |Nigeria |Middle East and Africa|
2.0000000000000000000|MX |Mexico |Americas |
3.0000000000000000000|ML |Malaysia |Asia |
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;
REGION_ID|COUNTRY_ID|COUNTRY_NAME |REGION_NAME|
---------+----------+---------------+-----------+
0|-- |Unknown Country| |
2|AR |Argentina |Americas |
3|AU |Australia |Asia |
1|BE |Belgium |Europe |
2|BR |Brazil |Americas |
2|CA |Canada |Americas |
1|CH |Switzerland |Europe |
3|CN |China |Asia |
1|DE |Germany |Europe |
1|DK |Denmark |Europe |
Snowflake¶
SELECT * FROM
hr.countries c
LEFT OUTER JOIN
hr.regions r USING (region_id)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
REGION_ID |COUNTRY_ID|COUNTRY_NAME |REGION_NAME|
---------------------+----------+---------------+-----------+
0.0000000000000000000|-- |Unknown Country| |
2.0000000000000000000|AR |Argentina |Americas |
3.0000000000000000000|AU |Australia |Asia |
1.0000000000000000000|BE |Belgium |Europe |
2.0000000000000000000|BR |Brazil |Americas |
2.0000000000000000000|CA |Canada |Americas |
1.0000000000000000000|CH |Switzerland |Europe |
3.0000000000000000000|CN |China |Asia |
1.0000000000000000000|DE |Germany |Europe |
1.0000000000000000000|DK |Denmark |Europe |
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;
COUNTRY_ID|COUNTRY_NAME |REGION_ID|REGION_ID|REGION_NAME|
----------+---------------+---------+---------+-----------+
-- |Unknown Country| 0| | |
AR |Argentina | 2| 2|Americas |
AU |Australia | 3| 3|Asia |
BE |Belgium | 1| 1|Europe |
BR |Brazil | 2| 2|Americas |
CA |Canada | 2| 2|Americas |
CH |Switzerland | 1| 1|Europe |
CN |China | 3| 3|Asia |
DE |Germany | 1| 1|Europe |
DK |Denmark | 1| 1|Europe |
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;
COUNTRY_ID|COUNTRY_NAME |REGION_ID |REGION_ID |REGION_NAME|
----------+---------------+---------------------+---------------------+-----------+
-- |Unknown Country|0.0000000000000000000| | |
AR |Argentina |2.0000000000000000000|2.0000000000000000000|Americas |
AU |Australia |3.0000000000000000000|3.0000000000000000000|Asia |
BE |Belgium |1.0000000000000000000|1.0000000000000000000|Europe |
BR |Brazil |2.0000000000000000000|2.0000000000000000000|Americas |
CA |Canada |2.0000000000000000000|2.0000000000000000000|Americas |
CH |Switzerland |1.0000000000000000000|1.0000000000000000000|Europe |
CN |China |3.0000000000000000000|3.0000000000000000000|Asia |
DE |Germany |1.0000000000000000000|1.0000000000000000000|Europe |
DK |Denmark |1.0000000000000000000|1.0000000000000000000|Europe |
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;
COUNTRY_ID|COUNTRY_NAME |REGION_ID|REGION_ID|REGION_NAME |
----------+------------------------+---------+---------+----------------------+
| | | 5|Oceania |
ZW |Zimbabwe | 4| 4|Middle East and Africa|
ZM |Zambia | 4| 4|Middle East and Africa|
US |United States of America| 2| 2|Americas |
UK |United Kingdom | 1| 1|Europe |
SG |Singapore | 3| 3|Asia |
NL |Netherlands | 1| 1|Europe |
NG |Nigeria | 4| 4|Middle East and Africa|
MX |Mexico | 2| 2|Americas |
ML |Malaysia | 3| 3|Asia |
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;
COUNTRY_ID|COUNTRY_NAME |REGION_ID |REGION_ID |REGION_NAME |
----------+------------------------+---------------------+---------------------+----------------------+
| | |5.0000000000000000000|Oceania |
ZW |Zimbabwe |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
ZM |Zambia |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
US |United States of America|2.0000000000000000000|2.0000000000000000000|Americas |
UK |United Kingdom |1.0000000000000000000|1.0000000000000000000|Europe |
SG |Singapore |3.0000000000000000000|3.0000000000000000000|Asia |
NL |Netherlands |1.0000000000000000000|1.0000000000000000000|Europe |
NG |Nigeria |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
MX |Mexico |2.0000000000000000000|2.0000000000000000000|Americas |
ML |Malaysia |3.0000000000000000000|3.0000000000000000000|Asia |
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;
|COUNTRY_ID|COUNTRY_NAME |REGION_ID|REGION_NAME|LOCATION_ID|STREET_ADDRESS |POSTAL_CODE|CITY |
|----------|--------------|---------|-----------|-----------|----------------------------------------|-----------|-----------|
| | |1 |Europe |2000 |40-5-12 Laogianggen |190518 |Beijing |
|CH |Switzerland |1 |Europe |3000 |Murtenstrasse 921 |3095 |Bern |
| | |1 |Europe |2100 |1298 Vileparle (E) |490231 |Bombay |
|CH |Switzerland |1 |Europe |2900 |20 Rue des Corps-Saints |1730 |Geneva |
| | |1 |Europe |1300 |9450 Kamiya-cho |6823 |Hiroshima |
|UK |United Kingdom|1 |Europe |2400 |8204 Arthur St | |London |
| | |1 |Europe |3200 |Mariano Escobedo 9991 |11932 |Mexico City|
|DE |Germany |1 |Europe |2700 |Schwanthalerstr. 7031 |80925 |Munich |
|UK |United Kingdom|1 |Europe |2500 |Magdalen Centre, The Oxford Science Park|OX9 9ZB |Oxford |
|IT |Italy |1 |Europe |1000 |1297 Via Cola di Rie |00989 |Roma |
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;
COUNTRY_ID|COUNTRY_NAME |REGION_ID |REGION_NAME|LOCATION_ID|STREET_ADDRESS |POSTAL_CODE|CITY |
----------+--------------+---------------------+-----------+-----------+----------------------------------------+-----------+-----------+
| |1.0000000000000000000|Europe | 2000|40-5-12 Laogianggen |190518 |Beijing |
CH |Switzerland |1.0000000000000000000|Europe | 3000|Murtenstrasse 921 |3095 |Bern |
| |1.0000000000000000000|Europe | 2100|1298 Vileparle (E) |490231 |Bombay |
CH |Switzerland |1.0000000000000000000|Europe | 2900|20 Rue des Corps-Saints |1730 |Geneva |
| |1.0000000000000000000|Europe | 1300|9450 Kamiya-cho |6823 |Hiroshima |
UK |United Kingdom|1.0000000000000000000|Europe | 2400|8204 Arthur St | |London |
| |1.0000000000000000000|Europe | 3200|Mariano Escobedo 9991 |11932 |Mexico City|
DE |Germany |1.0000000000000000000|Europe | 2700|Schwanthalerstr. 7031 |80925 |Munich |
UK |United Kingdom|1.0000000000000000000|Europe | 2500|Magdalen Centre, The Oxford Science Park|OX9 9ZB |Oxford |
IT |Italy |1.0000000000000000000|Europe | 1000|1297 Via Cola di Rie |00989 |Roma |
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;
REGION_ID|REGION_NAME|
---------+-----------+
2|Americas |
3|Asia |
Snowflake¶
SELECT * FROM
hr.regions r
WHERE
r.region_name LIKE 'A%'
ORDER BY region_id;
REGION_ID |REGION_NAME|
---------------------+-----------+
2.0000000000000000000|Americas |
3.0000000000000000000|Asia |
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;
COUNTRY_ID|COUNTRY_NAME |REGION_ID|REGION_ID|REGION_NAME|LOCATION_ID|STREET_ADDRESS |POSTAL_CODE|CITY |STATE_PROVINCE |COUNTRY_ID|
----------+--------------+---------+---------+-----------+-----------+----------------------------------------+-----------+-----------+-----------------+----------+
| | | 1|Europe | 2000|40-5-12 Laogianggen |190518 |Beijing | |CN |
CH |Switzerland | 1| 1|Europe | 3000|Murtenstrasse 921 |3095 |Bern |BE |CH |
| | | 1|Europe | 2100|1298 Vileparle (E) |490231 |Bombay |Maharashtra |IN |
CH |Switzerland | 1| 1|Europe | 2900|20 Rue des Corps-Saints |1730 |Geneva |Geneve |CH |
| | | 1|Europe | 1300|9450 Kamiya-cho |6823 |Hiroshima | |JP |
UK |United Kingdom| 1| 1|Europe | 2400|8204 Arthur St | |London | |UK |
| | | 1|Europe | 3200|Mariano Escobedo 9991 |11932 |Mexico City|Distrito Federal,|MX |
DE |Germany | 1| 1|Europe | 2700|Schwanthalerstr. 7031 |80925 |Munich |Bavaria |DE |
UK |United Kingdom| 1| 1|Europe | 2500|Magdalen Centre, The Oxford Science Park|OX9 9ZB |Oxford |Oxford |UK |
IT |Italy | 1| 1|Europe | 1000|1297 Via Cola di Rie |00989 |Roma | |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;
REGION_ID |REGION_NAME|LOCATION_ID|STREET_ADDRESS |POSTAL_CODE|CITY |STATE_PROVINCE |COUNTRY_ID|COUNTRY_ID|COUNTRY_NAME |REGION_ID |
---------------------+-----------+-----------+----------------------------------------+-----------+-----------+-----------------+----------+----------+--------------+---------------------+
1.0000000000000000000|Europe | 2000|40-5-12 Laogianggen |190518 |Beijing | |CN | | | |
1.0000000000000000000|Europe | 3000|Murtenstrasse 921 |3095 |Bern |BE |CH |CH |Switzerland |1.0000000000000000000|
1.0000000000000000000|Europe | 2100|1298 Vileparle (E) |490231 |Bombay |Maharashtra |IN | | | |
1.0000000000000000000|Europe | 2900|20 Rue des Corps-Saints |1730 |Geneva |Geneve |CH |CH |Switzerland |1.0000000000000000000|
1.0000000000000000000|Europe | 1300|9450 Kamiya-cho |6823 |Hiroshima | |JP | | | |
1.0000000000000000000|Europe | 2400|8204 Arthur St | |London | |UK |UK |United Kingdom|1.0000000000000000000|
1.0000000000000000000|Europe | 3200|Mariano Escobedo 9991 |11932 |Mexico City|Distrito Federal,|MX | | | |
1.0000000000000000000|Europe | 2700|Schwanthalerstr. 7031 |80925 |Munich |Bavaria |DE |DE |Germany |1.0000000000000000000|
1.0000000000000000000|Europe | 2500|Magdalen Centre, The Oxford Science Park|OX9 9ZB |Oxford |Oxford |UK |UK |United Kingdom|1.0000000000000000000|
1.0000000000000000000|Europe | 1000|1297 Via Cola di Rie |00989 |Roma | |IT |IT |Italy |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;
COUNTRY_ID|COUNTRY_NAME|REGION_ID|REGION_ID|REGION_NAME|LOCATION_ID|STREET_ADDRESS |POSTAL_CODE|CITY |STATE_PROVINCE |COUNTRY_ID|
----------+------------+---------+---------+-----------+-----------+----------------------------------------+-----------+-----------+-----------------+----------+
| | | 1|Europe | 2000|40-5-12 Laogianggen |190518 |Beijing | |CN |
| | | 1|Europe | 3000|Murtenstrasse 921 |3095 |Bern |BE |CH |
| | | 1|Europe | 2100|1298 Vileparle (E) |490231 |Bombay |Maharashtra |IN |
| | | 1|Europe | 2900|20 Rue des Corps-Saints |1730 |Geneva |Geneve |CH |
| | | 1|Europe | 1300|9450 Kamiya-cho |6823 |Hiroshima | |JP |
| | | 1|Europe | 2400|8204 Arthur St | |London | |UK |
| | | 1|Europe | 3200|Mariano Escobedo 9991 |11932 |Mexico City|Distrito Federal,|MX |
| | | 1|Europe | 2700|Schwanthalerstr. 7031 |80925 |Munich |Bavaria |DE |
| | | 1|Europe | 2500|Magdalen Centre, The Oxford Science Park|OX9 9ZB |Oxford |Oxford |UK |
| | | 1|Europe | 1000|1297 Via Cola di Rie |00989 |Roma | |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](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/oracleEWI. md#ssc-ewi-or0090):Eine nicht-ANSI-konforme äußere Verknüpfung 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
Lesen Sie diesen Abschnitt 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;
Employees and Their Managers|
----------------------------+
Rajs works for Mourgos |
Raphaely works for King |
Rogers works for Kaufling |
Russell works for 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;
Employees and Their Managers|
----------------------------+
Rajs works for Mourgos |
Raphaely works for King |
Rogers works for Kaufling |
Russell works for 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 EXISTS
Unterabfrage 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 einem OR
-Zweig der WHERE
-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
Lesen Sie diesen Abschnitt 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;
DEPARTMENT_ID|DEPARTMENT_NAME |MANAGER_ID|LOCATION_ID|
-------------+----------------+----------+-----------+
110|Accounting | 205| 1700|
10|Administration | 200| 1700|
90|Executive | 100| 1700|
100|Finance | 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|Shipping | 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;
DEPARTMENT_ID|DEPARTMENT_NAME |MANAGER_ID|LOCATION_ID|
-------------+----------------+----------+-----------+
110|Accounting | 205| 1700|
10|Administration | 200| 1700|
90|Executive | 100| 1700|
100|Finance | 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|Shipping | 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.