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:

equijoin.md

band-join.md

self-join.md

cartesian-products.md

inner-join.md

outer-join.md

semijoin.md

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;
Copy
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   |

Copy
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;
Copy
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   |

Copy

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;
Copy
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          |

Copy
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;
Copy
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          |

Copy

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
Copy
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   |

Copy
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;
Copy
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   |

Copy

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;
Copy
|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       |


Copy
|COUNT(*)|
|--------|
|2889    |


Copy
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;
Copy
|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       |


Copy
|COUNT(*)|
|--------|
|2889    |


Copy

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;
Copy
|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       |


Copy
|COUNT(*)|
|--------|
|2889    |


Copy
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;
Copy

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;
Copy
|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|


Copy
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;
Copy
|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|


Copy

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
}

Copy

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;
Copy
|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       |


Copy
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;
Copy
|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       |


Copy

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;
Copy
|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       |


Copy
Snowflake
 SELECT
    *
FROM
hr.employees
INNER JOIN
    hr.departments
    USING(department_id)
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|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       |


Copy

Cross Inner Join

Oracle
 SELECT 
    *
FROM 
    hr.employees
CROSS JOIN hr.departments
ORDER BY department_name, employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|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       |


Copy
Snowflake
 SELECT
    *
FROM
hr.employees
CROSS JOIN hr.departments
ORDER BY department_name, employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|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       |


Copy

Natural Inner Join

Oracle
 SELECT 
    *
FROM 
    hr.employees
NATURAL JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|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       |


Copy
Snowflake
 SELECT
    *
FROM
hr.employees
NATURAL JOIN
    hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|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       |


Copy

Cross Natural Join

Oracle
 SELECT 
    *
FROM 
    hr.employees
CROSS NATURAL JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|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       |


Copy
Snowflake
 SELECT
    *
FROM
    hr.employees
    NATURAL JOIN
        hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|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       |


Copy

Natural Cross Join

Oracle
 SELECT 
    *
FROM 
    hr.employees
NATURAL CROSS JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|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       |


Copy
Snowflake
 SELECT
    *
FROM
    hr.employees
    CROSS JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|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       |


Copy

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 ]...)
 ]
Copy
 outer_join_type
{ FULL | LEFT | RIGHT } [ OUTER ]
Copy

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 (+)
Copy

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> ]
[ ... ]
Copy
 SELECT *
FROM <object_ref1> [
                     {
                       INNER
                       | { LEFT | RIGHT | FULL } [ OUTER ]
                     }
                   ]
                   JOIN <object_ref2>
  [ USING( <column_list> ) ]
[ ... ]
Copy
 SELECT ...
FROM <object_ref1> [
                     {
                       | NATURAL [ { LEFT | RIGHT | FULL } [ OUTER ] ]
                       | CROSS
                     }
                   ]
                   JOIN <object_ref2>
[ ... ]
Copy

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);
Copy

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;
Copy
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     |

Copy
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;
Copy
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     |

Copy

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;
Copy
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                  |

Copy
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;
Copy
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                  |

Copy

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;
Copy
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                |

Copy
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;
Copy
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                |

Copy

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;
Copy
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     |

Copy
Snowflake
 SELECT * FROM
hr.countries c
NATURAL LEFT OUTER JOIN
hr.regions r
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
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     |

Copy

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;
Copy
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                  |

Copy
Snowflake
 SELECT * FROM
hr.countries c
NATURAL RIGHT OUTER JOIN
hr.regions r
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Copy
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                  |

Copy

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;
Copy
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     |

Copy
Snowflake
 SELECT * FROM
hr.countries c
LEFT OUTER JOIN
hr.regions r USING (region_id)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
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     |

Copy

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;
Copy
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     |

Copy
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;
Copy
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     |

Copy

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;
Copy
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                  |

Copy
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;
Copy
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                  |

Copy

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;
Copy
|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       |

Copy
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;
Copy
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       |

Copy

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;
Copy
REGION_ID|REGION_NAME|
---------+-----------+
        2|Americas   |
        3|Asia       |

Copy
Snowflake
 SELECT * FROM
hr.regions r
WHERE
r.region_name LIKE 'A%'
ORDER BY region_id;
Copy
REGION_ID            |REGION_NAME|
---------------------+-----------+
2.0000000000000000000|Americas   |
3.0000000000000000000|Asia       |

Copy

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;
Copy
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        |

Copy
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;
Copy
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|

Copy
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;
Copy
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        |

Copy
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;
Copy

Zugehörige EWIs

  1. [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;
Copy
Employees and Their Managers|
----------------------------+
Rajs works for Mourgos      |
Raphaely works for King     |
Rogers works for Kaufling   |
Russell works for King      |

Copy
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;
Copy
Employees and Their Managers|
----------------------------+
Rajs works for Mourgos      |
Raphaely works for King     |
Rogers works for Kaufling   |
Russell works for King      |

Copy

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;
Copy
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|

Copy
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;
Copy
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|

Copy

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.