SnowConvert AI – Oracle – Joins

Ein Join ist eine Abfrage, die Zeilen aus zwei oder mehr Tabellen, Ansichten oder materialisierten Ansichten kombiniert. Oracle Database führt eine Verknüpfung durch, wenn mehrere Tabellen in der FROM-Klausel der Abfrage erscheinen. (Oracle SQL Language Reference JOINS)

Antijoin

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Beschreibung

Ein Antijoin gibt Zeilen auf der linken Seite des Prädikats zurück, für die es keine entsprechenden Zeilen auf der rechten Seite des Prädikats gibt. Er gibt Zeilen zurück, die nicht mit der Unterabfrage auf der rechten Seite übereinstimmen (NOT IN). Die Antijoin-Transformation kann nicht durchgeführt werden, wenn sich die Unterabfrage auf einem OR-Zweig 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

Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.

Nicht enthalten

Oracle
SELECT e.employee_id, e.first_name, e.last_name FROM hr.employees e
WHERE e.department_id NOT IN

    (SELECT h.department_id FROM hr.departments h WHERE location_id = 1700)
    
ORDER BY e.last_name
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

EMPLOYEE_ID

FIRST_NAME

LAST_NAME

174

Ellen

Abel

166

Sundar

Ande

130

Mozhe

Atkinson

105

David

Austin

204

Hermann

Baer

167

Amit

Banda

172

Elizabeth

Bates

192

Sarah

Bell

151

David

Bernstein

129

Laura

Bissot

Snowflake
SELECT e.employee_id, e.first_name, e.last_name FROM
    hr.employees e
WHERE e.department_id NOT IN
        !!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!!
    (SELECT h.department_id FROM
            hr.departments h WHERE location_id = 1700)

ORDER BY e.last_name
    FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

EMPLOYEE_ID

FIRST_NAME

LAST_NAME

174

Ellen

Abel

166

Sundar

Ande

130

Mozhe

Atkinson

105

David

Austin

204

Hermann

Baer

167

Amit

Banda

172

Elizabeth

Bates

192

Sarah

Bell

151

David

Bernstein

129

Laura

Bissot

Nicht vorhanden

Oracle
SELECT   d.department_id, d.department_name
FROM     hr.departments d
WHERE    NOT EXISTS
         
         (SELECT 1 FROM hr.employees E WHERE
         e.department_id = d.department_id)
         
ORDER BY d.department_id
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

DEPARTMENT_ID

DEPARTMENT_NAME

120

Schatzamt

130

Unternehmenssteuer

140

Controlling und Credit

150

Aktionärsdienste

160

Vorteile

170

Manufacturing

180

Konstruktion

190

Verträge

200

Operationen

210

Unterstützung von IT

Snowflake
SELECT   d.department_id, d.department_name
FROM
         hr.departments d
WHERE    NOT EXISTS
                  !!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!!
         (SELECT 1 FROM
                           hr.employees E WHERE
         e.department_id = d.department_id)

ORDER BY d.department_id
         FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

DEPARTMENT_ID

DEPARTMENT_NAME

120

Schatzamt

130

Unternehmenssteuer

140

Controlling und Credit

150

Aktionärsdienste

160

Vorteile

170

Manufacturing

180

Konstruktion

190

Verträge

200

Operationen

210

Unterstützung von IT

Bekannte Probleme

1. Results ordering mismatch between languages

Das Ergebnis der Abfrage hat in beiden Datenbank-Engines den gleichen Inhalt, aber die Reihenfolge kann unterschiedlich sein, wenn in der Abfrage keine ORDER BY-Klausel definiert ist.

Band Join

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Beschreibung

Ein Band Join ist ein spezieller Typ von nonequijoin, bei dem die Schlüsselwerte in einem Datensatz in den angegebenen Bereich („Band“) des zweiten Datensatzes fallen müssen. Dieselbe Tabelle kann sowohl als erster als auch als zweiter Datensatz dienen. (Oracle SQL Language Reference BandJoin)

In diesem Abschnitt werden wir sehen, wie ein Band Join in Snowflake ausgeführt wird. Der Ausführungsplan ist der verbesserten Version von Oracle sehr ähnlich.

Beispielhafte Quellcode-Muster

Bemerkung

ORDER BY-Klausel hinzugefügt, da die Reihenfolge der Ergebnisse zwischen Oracle und Snowflake variieren kann.

Bemerkung

Da die Ergebnismenge zu groß ist, wurde die Zeilenbegrenzungsklausel hinzugefügt. Sie können es entfernen, um das gesamte Resultset abzurufen.

Bemerkung

Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.

Warnung

Wenn Sie diesen Code ohne die Tabellenerstellung migrieren, kann der Konverter die semantischen Informationen der Spalten nicht laden und es wird eine Warnung bei den arithmetischen Operationen angezeigt.

Einfacher Band-Join-Fall

Oracle
SELECT  e1.last_name || 
        ' has salary between 100 less and 100 more than ' || 
        e2.last_name AS "SALARY COMPARISON"
FROM    employees e1, 
        employees e2
WHERE   e1.salary 
BETWEEN e2.salary - 100 
AND     e2.salary + 100
ORDER BY "SALARY COMPARISON"
FETCH FIRST 10 ROWS ONLY
Copy
Ergebnis

SALARY-COMPARISON

Abels Gehalt liegt zwischen 100 weniger und 100 mehr als das von Abel

Abels Gehalt liegt zwischen 100 weniger und 100 mehr als das von Cambrault

Abels Gehalt liegt zwischen 100 weniger und 100 mehr als das von Raphaely

Andes Gehalt liegt zwischen 100 weniger und 100 mehr als das von Ande

Andes Gehalt liegt zwischen 100 weniger und 100 mehr als das von Mavris

Andes Gehalt liegt zwischen 100 weniger und 100 mehr als das von Vollman

Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Atkinson

Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Baida

Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Gates

Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Geoni

Snowflake
SELECT
                NVL(  e1.last_name :: STRING, '') ||
                ' has salary between 100 less and 100 more than ' || NVL(
                e2.last_name :: STRING, '') AS "SALARY COMPARISON"
FROM
                employees e1,
                employees e2
WHERE   e1.salary
BETWEEN
        !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!! e2.salary - 100
AND
        !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!!     e2.salary + 100
ORDER BY "SALARY COMPARISON"
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

SALARY-COMPARISON

Abels Gehalt liegt zwischen 100 weniger und 100 mehr als das von Abel

Abels Gehalt liegt zwischen 100 weniger und 100 mehr als das von Cambrault

Abels Gehalt liegt zwischen 100 weniger und 100 mehr als das von Raphaely

Andes Gehalt liegt zwischen 100 weniger und 100 mehr als das von Ande

Andes Gehalt liegt zwischen 100 weniger und 100 mehr als das von Mavris

Andes Gehalt liegt zwischen 100 weniger und 100 mehr als das von Vollman

Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Atkinson

Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Baida

Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Gates

Atkinsons Gehalt liegt zwischen 100 weniger und 100 mehr als das von Geoni

Warnung

Die Migration einiger SELECT-Anweisungen ohne die entsprechenden Tabellen könnte zu einem SSC-EWI-OR0036 führen: Probleme bei der Auflösung von Typen. Um diese Warnung zu vermeiden, fügen Sie CREATE TABLE innerhalb der Datei ein.

Die Ergebnisse sind die gleichen, so dass BAND JOIN funktional gleichwertig ist.

Ausführungsplan

Als zusätzliche Information ist das Besondere an Band Joins der Ausführungsplan.

Das folgende Bild zeigt den erweiterten Ausführungsplan (implementiert seit Oracle 12c) für die Testabfrage:

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

Bemerkung

Der Ausführungsplan in Snowflake ist der optimierten Version von Oracle sehr ähnlich. Die endgültige Dauer und Leistung der Abfrage wird von vielen anderen Faktoren beeinflusst und hängt vollständig von der internen Funktionalität der einzelnen DBMS ab.

Bekannte Probleme

1. Results ordering mismatch between languages

Das Ergebnis der Abfrage hat in beiden Datenbank-Engines den gleichen Inhalt, aber die Reihenfolge kann unterschiedlich sein, wenn in der Abfrage keine ORDER BY-Klausel definiert ist.

Zugehörige EWIs

  • SSC-EWI-OR0036: Bei Problemen mit der Auflösung von Typen verhält sich die arithmetische Operation zwischen Zeichenfolge und Datum möglicherweise nicht korrekt.

Kartesische Produkte

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Wenn zwei Tabellen in einer Datenbankabfrage keine Join-Bedingung haben, dann gibt Oracle Database ihr kartesisches Produkt zurück. Oracle kombiniert jede Zeile der einen Tabelle mit jeder Zeile der anderen. (Oracle SQL-Referenz: Unterabschnitt „Kartesische Produkte“)

Oracle und Snowflake sind auch mit der ANSI-Cross Join-Syntax kompatibel, die die gleiche Verhaltensweise wie ein kartesisches Produkt hat.

Für diese Art von Join wird keine spezielle Transformation durchgeführt, da Snowflake dieselbe Syntax unterstützt.

Beispielhafte Quellcode-Muster

Bemerkung

Die ORDER BY-Klausel wurde hinzugefügt, weil die Reihenfolge der Ergebnisse zwischen Oracle und Snowflake variieren kann.

Bemerkung

Da die Ergebnismenge zu groß ist, wurde die Zeilenbegrenzungsklausel hinzugefügt. Sie können es entfernen, um das gesamte Resultset abzurufen.

Bemerkung

Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.

Implizite Syntax

Oracle
-- Resulting rows
SELECT * FROM hr.employees, hr.departments
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY;

-- Resulting total rows
SELECT COUNT(*) FROM hr.employees, hr.departments;
Copy
Ergebnis 1

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

Versand

121

1500

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

40

Human Resources

203

2400

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

30

Purchasing

114

1700

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

20

Marketing

201

1800

Ergebnis 2

COUNT(*)

2889

Snowflake
-- Resulting rows
SELECT * FROM
hr.employees,
hr.departments
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY;

-- Resulting total rows
SELECT COUNT(*) FROM
hr.employees,
hr.departments;
Copy
Ergebnis 1

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

Versand

121

1500

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10

ST_MAN

8200.00

100

50

30

Purchasing

114

1700

Ergebnis 2

COUNT(*)

2889

Syntax für Kreuzverknüpfungen (Cross Join Syntax)

Oracle
-- Resulting rows
SELECT * FROM hr.employees CROSS join hr.departments
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY;

-- Resulting total rows
SELECT COUNT(*) FROM hr.employees CROSS join hr.departments;
Copy
Ergebnis 1

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

Versand

121

1500

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

40

Human Resources

203

2400

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

30

Purchasing

114

1700

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

20

Marketing

201

1800

Ergebnis 2

COUNT(*)

2889

Snowflake
-- Resulting rows
SELECT * FROM
hr.employees
CROSS join hr.departments
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY;

-- Resulting total rows
SELECT COUNT(*) FROM
hr.employees
CROSS join hr.departments;
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

Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.

Grundlegender Equijoin-Fall

Oracle
 SELECT last_name, job_id, hr.departments.department_id, department_name
FROM hr.employees, hr.departments
WHERE hr.employees.department_id = hr.departments.department_id
ORDER BY last_name
FETCH FIRST 5 ROWS ONLY;
Copy
Ergebnis

LAST_NAME

JOB_ID

DEPARTMENT_ID

DEPARTMENT_NAME

Abel

SA_REP

80

Sales

Ande

SA_REP

80

Sales

Atkinson

ST_CLERK

50

Versand

Austin

IT_PROG

60

IT

Baer

PR_REP

70

Public Relations

Snowflake
 SELECT last_name, job_id, hr.departments.department_id, department_name
FROM
hr.employees,
hr.departments
WHERE hr.employees.department_id = hr.departments.department_id
ORDER BY last_name
FETCH FIRST 5 ROWS ONLY;
Copy
Ergebnis

LAST_NAME

JOB_ID

DEPARTMENT_ID

DEPARTMENT_NAME

Abel

SA_REP

80

Sales

Ande

SA_REP

80

Sales

Atkinson

ST_CLERK

50

Versand

Austin

IT_PROG

60

IT

Baer

PR_REP

70

Public Relations

Bekannte Probleme

1. Results ordering mismatch between languages

Das Ergebnis der Abfrage hat in beiden Datenbank-Engines den gleichen Inhalt, aber die Reihenfolge kann unterschiedlich sein, wenn in der Abfrage keine ORDER BY-Klausel definiert ist.

Zugehörige EWIs

Keine zugehörigen EWIs.

Innere Verknüpfung (Inner Join)

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Beschreibung

Ein Inner Join (manchmal auch einfacher Join genannt) ist eine Verknüpfung von zwei oder mehr Tabellen, die nur die Zeilen zurückgibt, die die Join-Bedingung erfüllen. (Oracle SQL Referenz: Unterabschnitt Inner Join).

{ [ INNER ] JOIN table_reference
 { ON condition
 | USING (column [, column ]...)
 }
| { CROSS
 | NATURAL [ INNER ]
 }
 JOIN table_reference
}
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

Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.

Grundlegender Inner Join

In der INNER JOIN-Klausel ist INNER ein optionales Schlüsselwort. Die folgenden Abfragen haben zwei Selects, die denselben Datensatz abrufen.

Oracle
 SELECT 
    *
FROM 
    hr.employees
INNER JOIN hr.departments ON
    hr.departments.department_id = hr.employees.department_id
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;

SELECT 
    *
FROM 
    hr.employees
JOIN hr.departments ON
    hr.departments.department_id = hr.employees.department_id
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
Ergebnis

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

Finanzen

108

1700

109

Daniel

Faviet

DFAVIET

515.124.4169

2002-08-16 00:00:00.000

FI_ACCOUNT

9000

108

100

100

Finanzen

108

1700

Snowflake
 SELECT
    *
FROM
hr.employees
INNER JOIN
    hr.departments
    ON
    hr.departments.department_id = hr.employees.department_id
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;

SELECT
    *
FROM
    hr.employees
JOIN
    hr.departments
    ON
    hr.departments.department_id = hr.employees.department_id
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
Ergebnis

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

Finanzen

108

1700

109

Daniel

Faviet

DFAVIET

515.124.4169

2002-08-16

FI_ACCOUNT

9000.00

108

100

100

Finanzen

108

1700

INNER JOIN mit Klausel

Oracle
SELECT 
    *
FROM 
    hr.employees
INNER JOIN hr.departments
    USING(department_id)
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
Ergebnis

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

Finanzen

108

1700

100

109

Daniel

Faviet

DFAVIET

515.124.4169

2002-08-16 00:00:00.000

FI_ACCOUNT

9000

108

Finanzen

108

1700

Snowflake
SELECT
    *
FROM
hr.employees
INNER JOIN
    hr.departments
    USING(department_id)
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
Ergebnis

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

Finanzen

108

1700

100

109

Daniel

Faviet

DFAVIET

515.124.4169

2002-08-16

FI_ACCOUNT

9000.00

108

Finanzen

108

1700

Cross Inner Join

Oracle
SELECT 
    *
FROM 
    hr.employees
CROSS JOIN hr.departments
ORDER BY department_name, employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
Ergebnis

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

Buchhaltung

205

1700

101

Neena

Kochhar

NKOCHHAR

515.123.4568

2005-09-21 00:00:00.000

AD_VP

17000

100

90

110

Buchhaltung

205

1700

102

Lex

De Haan

LDEHAAN

515.123.4569

2001-01-13 00:00:00.000

AD_VP

17000

100

90

110

Buchhaltung

205

1700

103

Alexander

Hunold

AHUNOLD

590.423.4567

2006-01-03 00:00:00.000

IT_PROG

9000

102

60

110

Buchhaltung

205

1700

104

Bruce

Ernst

BERNST

590.423.4568

2007-05-21 00:00:00.000

IT_PROG

6000

103

60

110

Buchhaltung

205

1700

105

David

Austin

DAUSTIN

590.423.4569

2005-06-25 00:00:00.000

IT_PROG

4800

103

60

110

Buchhaltung

205

1700

106

Valli

Pataballa

VPATABAL

590.423.4560

2006-02-05 00:00:00.000

IT_PROG

4800

103

60

110

Buchhaltung

205

1700

107

Diana

Lorentz

DLORENTZ

590.423.5567

2007-02-07 00:00:00.000

IT_PROG

4200

103

60

110

Buchhaltung

205

1700

108

Nancy

Greenberg

NGREENBE

515.124.4569

2002-08-17 00:00:00.000

FI_MGR

12008

101

100

110

Buchhaltung

205

1700

109

Daniel

Faviet

DFAVIET

515.124.4169

2002-08-16 00:00:00.000

FI_ACCOUNT

9000

108

100

110

Buchhaltung

205

1700

Snowflake
 SELECT
    *
FROM
hr.employees
CROSS JOIN hr.departments
ORDER BY department_name, employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
Ergebnis

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

Buchhaltung

205

1700

101

Neena

Kochhar

NKOCHHAR

515.123.4568

2005-09-21

AD_VP

17000.00

100

90

110

Buchhaltung

205

1700

102

Lex

De Haan

LDEHAAN

515.123.4569

2001-01-13

AD_VP

17000.00

100

90

110

Buchhaltung

205

1700

103

Alexander

Hunold

AHUNOLD

590.423.4567

2006-01-03

IT_PROG

9000.00

102

60

110

Buchhaltung

205

1700

104

Bruce

Ernst

BERNST

590.423.4568

2007-05-21

IT_PROG

6000.00

103

60

110

Buchhaltung

205

1700

105

David

Austin

DAUSTIN

590.423.4569

2005-06-25

IT_PROG

4800.00

103

60

110

Buchhaltung

205

1700

106

Valli

Pataballa

VPATABAL

590.423.4560

2006-02-05

IT_PROG

4800.00

103

60

110

Buchhaltung

205

1700

107

Diana

Lorentz

DLORENTZ

590.423.5567

2007-02-07

IT_PROG

4200.00

103

60

110

Buchhaltung

205

1700

108

Nancy

Greenberg

NGREENBE

515.124.4569

2002-08-17

FI_MGR

12008.00

101

100

110

Buchhaltung

205

1700

109

Daniel

Faviet

DFAVIET

515.124.4169

2002-08-16

FI_ACCOUNT

9000.00

108

100

110

Buchhaltung

205

1700

Natural Inner Join

Oracle
SELECT 
    *
FROM 
    hr.employees
NATURAL JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
Ergebnis

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

Finanzen

1700

108

100

110

John

Chen

JCHEN

515.124.4269

2005-09-28 00:00:00.000

FI_ACCOUNT

8200

Finanzen

1700

108

100

111

Ismael

Sciarra

ISCIARRA

515.124.4369

2005-09-30 00:00:00.000

FI_ACCOUNT

7700

Finanzen

1700

108

100

112

Jose Manuel

Urman

JMURMAN

515.124.4469

2006-03-07 00:00:00.000

FI_ACCOUNT

7800

Finanzen

1700

Snowflake
SELECT
    *
FROM
hr.employees
NATURAL JOIN
    hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
Ergebnis

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

Finanzen

1700

108

100

110

John

Chen

JCHEN

515.124.4269

2005-09-28

FI_ACCOUNT

8200.00

Finanzen

1700

108

100

111

Ismael

Sciarra

ISCIARRA

515.124.4369

2005-09-30

FI_ACCOUNT

7700.00

Finanzen

1700

108

100

112

Jose Manuel

Urman

JMURMAN

515.124.4469

2006-03-07

FI_ACCOUNT

7800.00

Finanzen

1700

Cross Natural Join

Oracle
SELECT 
    *
FROM 
    hr.employees
CROSS NATURAL JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
Ergebnis

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

Finanzen

1700

108

100

110

John

Chen

JCHEN

515.124.4269

2005-09-28 00:00:00.000

FI_ACCOUNT

8200

Finanzen

1700

108

100

111

Ismael

Sciarra

ISCIARRA

515.124.4369

2005-09-30 00:00:00.000

FI_ACCOUNT

7700

Finanzen

1700

108

100

112

Jose Manuel

Urman

JMURMAN

515.124.4469

2006-03-07 00:00:00.000

FI_ACCOUNT

7800

Finanzen

1700

Snowflake
SELECT
    *
FROM
    hr.employees
    NATURAL JOIN
        hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
Ergebnis

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

Finanzen

1700

108

100

110

John

Chen

JCHEN

515.124.4269

2005-09-28

FI_ACCOUNT

8200.00

Finanzen

1700

108

100

111

Ismael

Sciarra

ISCIARRA

515.124.4369

2005-09-30

FI_ACCOUNT

7700.00

Finanzen

1700

108

100

112

Jose Manuel

Urman

JMURMAN

515.124.4469

2006-03-07

FI_ACCOUNT

7800.00

Finanzen

1700

Natural Cross Join

Oracle
SELECT 
    *
FROM 
    hr.employees
NATURAL CROSS JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
Ergebnis

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

Finanzen

108

1700

100

Steven

King

SKING

515.123.4567

2003-06-17 00:00:00.000

AD_PRES

24000

90

90

Executive

100

1700

100

Steven

King

SKING

515.123.4567

2003-06-17 00:00:00.000

AD_PRES

24000

90

80

Sales

145

2500

100

Steven

King

SKING

515.123.4567

2003-06-17 00:00:00.000

AD_PRES

24000

90

70

Public Relations

204

2700

100

Steven

King

SKING

515.123.4567

2003-06-17 00:00:00.000

AD_PRES

24000

90

60

IT

103

1400

100

Steven

King

SKING

515.123.4567

2003-06-17 00:00:00.000

AD_PRES

24000

90

50

Versand

121

1500

100

Steven

King

SKING

515.123.4567

2003-06-17 00:00:00.000

AD_PRES

24000

90

40

Human Resources

203

2400

100

Steven

King

SKING

515.123.4567

2003-06-17 00:00:00.000

AD_PRES

24000

90

30

Purchasing

114

1700

100

Steven

King

SKING

515.123.4567

2003-06-17 00:00:00.000

AD_PRES

24000

90

20

Marketing

201

1800

Snowflake
SELECT
    *
FROM
    hr.employees
    CROSS JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
Ergebnis

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

Finanzen

108

1700

100

Steven

King

SKING

515.123.4567

2003-06-17

AD_PRES

24000.00

90

50

Versand

121

1500

100

Steven

King

SKING

515.123.4567

2003-06-17

AD_PRES

24000.00

90

40

Human Resources

203

2400

Bekannte Probleme

1. Results ordering mismatch between languages

Das Ergebnis der Abfrage hat in beiden Datenbank-Engines den gleichen Inhalt, aber die Reihenfolge kann unterschiedlich sein, wenn in der Abfrage keine ORDER BY-Klausel definiert ist.

Zugehörige EWIs

Keine zugehörigen EWIs.

Äußerer Verknüpfung (Outer Join)

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Beschreibung

Ein Outer Join erweitert das Ergebnis einer einfachen Verknüpfung. Ein Outer Join gibt alle Zeilen zurück, die die Join-Bedingung erfüllen und gibt einige oder alle Zeilen aus einer Tabelle zurück, für die keine Zeilen aus der anderen Tabelle die Join-Bedingung erfüllen. (Oracle SQL Language Reference Outer Joins Subsection).

Oracle ANSI-Syntax

[ query_partition_clause ] [ NATURAL ]
outer_join_type JOIN table_reference
 [ query_partition_clause ]
 [ ON condition
 | USING ( column [, column ]...)
 ]
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

Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.

Bemerkung

Für die folgenden Beispiele wurden diese Einfügungen und ALTER-Anweisungen ausgeführt, um das Ergebnis für jede Art von JOIN besser unterscheiden zu können:

INSERT INTO hr.regions VALUES (5, 'Oceania');
ALTER TABLE hr.countries DROP CONSTRAINT countr_reg_fk;
INSERT INTO hr.countries VALUES ('--', 'Unknown Country', 0);
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
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_ID

REGION_NAME

Unbekanntes Land

0

AR

Argentinien

2

2

Amerika

AU

Australien

3

3

Asien

BE

Belgien

1

1

Europa

BR

Brasilien

2

2

Amerika

CA

Kanada

2

2

Amerika

CH

Schweiz

1

1

Europa

CN

China

3

3

Asien

DE

Deutschland

1

1

Europa

DK

Dänemark

1

1

Europa

Snowflake
SELECT * FROM
hr.countries c
LEFT OUTER JOIN
hr.regions r ON c.region_id = r.region_id
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_ID

REGION_NAME

Unbekanntes Land

0.0000000000000000000

AR

Argentinien

2.0000000000000000000

2.0000000000000000000

Amerika

AU

Australien

3.0000000000000000000

3.0000000000000000000

Asien

BE

Belgien

1.0000000000000000000

1.0000000000000000000

Europa

BR

Brasilien

2.0000000000000000000

2.0000000000000000000

Amerika

CA

Kanada

2.0000000000000000000

2.0000000000000000000

Amerika

CH

Schweiz

1.0000000000000000000

1.0000000000000000000

Europa

CN

China

3.0000000000000000000

3.0000000000000000000

Asien

DE

Deutschland

1.0000000000000000000

1.0000000000000000000

Europa

DK

Dänemark

1.0000000000000000000

1.0000000000000000000

Europa

Rechter Outer Join in

Oracle
SELECT * FROM
hr.countries c
RIGHT OUTER JOIN hr.regions r ON c.region_id = r.region_id
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_ID

REGION_NAME

5

Ozeanien

ZW

Simbabwe

4

4

Naher Osten und Afrika

ZM

Sambia

4

4

Naher Osten und Afrika

US

Vereinigte Staaten von Amerika

2

2

Amerika

UK

Großbritannien

1

1

Europa

SG

Singapur

3

3

Asien

NL

Niederlande

1

1

Europa

NG

Nigeria

4

4

Naher Osten und Afrika

MX

Mexiko

2

2

Amerika

ML

Malaysia

3

3

Asien

Snowflake
SELECT * FROM
hr.countries c
RIGHT OUTER JOIN
hr.regions r ON c.region_id = r.region_id
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_ID

REGION_NAME

5.0000000000000000000

Ozeanien

ZW

Simbabwe

4.0000000000000000000

4.0000000000000000000

Naher Osten und Afrika

ZM

Sambia

4.0000000000000000000

4.0000000000000000000

Naher Osten und Afrika

US

Vereinigte Staaten von Amerika

2.0000000000000000000

2.0000000000000000000

Amerika

UK

Großbritannien

1.0000000000000000000

1.0000000000000000000

Europa

SG

Singapur

3.0000000000000000000

3.0000000000000000000

Asien

NL

Niederlande

1.0000000000000000000

1.0000000000000000000

Europa

NG

Nigeria

4.0000000000000000000

4.0000000000000000000

Naher Osten und Afrika

MX

Mexiko

2.0000000000000000000

2.0000000000000000000

Amerika

ML

Malaysia

3.0000000000000000000

3.0000000000000000000

Asien

Vollständiger Outer Join in

Oracle
SELECT * FROM
hr.countries c
FULL OUTER JOIN hr.regions r ON c.region_id = r.region_id
ORDER BY r.region_name DESC, c.country_id
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_ID

REGION_NAME

Unbekanntes Land

0

5

Ozeanien

EG

Ägypten

4

4

Naher Osten und Afrika

IL

Israel

4

4

Naher Osten und Afrika

KW

Kuwait

4

4

Naher Osten und Afrika

NG

Nigeria

4

4

Naher Osten und Afrika

ZM

Sambia

4

4

Naher Osten und Afrika

ZW

Simbabwe

4

4

Naher Osten und Afrika

BE

Belgien

1

1

Europa

CH

Schweiz

1

1

Europa

Snowflake
SELECT * FROM
hr.countries c
FULL OUTER JOIN
hr.regions r ON c.region_id = r.region_id
ORDER BY r.region_name DESC, c.country_id
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_ID

REGION_NAME

Unbekanntes Land

0.0000000000000000000

5.0000000000000000000

Ozeanien

EG

Ägypten

4.0000000000000000000

4.0000000000000000000

Naher Osten und Afrika

IL

Israel

4.0000000000000000000

4.0000000000000000000

Naher Osten und Afrika

KW

Kuwait

4.0000000000000000000

4.0000000000000000000

Naher Osten und Afrika

NG

Nigeria

4.0000000000000000000

4.0000000000000000000

Naher Osten und Afrika

ZM

Sambia

4.0000000000000000000

4.0000000000000000000

Naher Osten und Afrika

ZW

Simbabwe

4.0000000000000000000

4.0000000000000000000

Naher Osten und Afrika

BE

Belgien

1.0000000000000000000

1.0000000000000000000

Europa

CH

Schweiz

1.0000000000000000000

1.0000000000000000000

Europa

2. Natural Outer Join

Sowohl Oracle als auch Snowflake unterstützen den Natural Outer Join und sie verhalten sich gleich.

Ein NATURALJOIN ist identisch mit einem expliziten JOIN für die gemeinsamen Spalten der beiden Tabellen, mit der Ausnahme, dass die gemeinsamen Spalten nur einmal in der Ausgabe enthalten sind. (Eine natürliche Verknüpfung (Natural Join) geht davon aus, dass Spalten mit demselben Namen, aber in verschiedenen Tabellen, entsprechende Daten enthalten.) (Snowflake SQL-Referenz: JOIN)

Natürliche linke äußere Verknüpfung (Natural Left Outer Join)

Oracle
SELECT * FROM
hr.countries c
NATURAL LEFT OUTER JOIN hr.regions r
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

REGION_ID

COUNTRY_ID

COUNTRY_NAME

REGION_NAME

0

Unbekanntes Land

2

AR

Argentinien

Amerika

3

AU

Australien

Asien

1

BE

Belgien

Europa

2

BR

Brasilien

Amerika

2

CA

Kanada

Amerika

1

CH

Schweiz

Europa

3

CN

China

Asien

1

DE

Deutschland

Europa

1

DK

Dänemark

Europa

Snowflake
SELECT * FROM
hr.countries c
NATURAL LEFT OUTER JOIN
hr.regions r
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

REGION_ID

COUNTRY_ID

COUNTRY_NAME

REGION_NAME

0.0000000000000000000

Unbekanntes Land

2.0000000000000000000

AR

Argentinien

Amerika

3.0000000000000000000

AU

Australien

Asien

1.0000000000000000000

BE

Belgien

Europa

2.0000000000000000000

BR

Brasilien

Amerika

2.0000000000000000000

CA

Kanada

Amerika

1.0000000000000000000

CH

Schweiz

Europa

3.0000000000000000000

CN

China

Asien

1.0000000000000000000

DE

Deutschland

Europa

1.0000000000000000000

DK

Dänemark

Europa

Natürliche rechte äußere Verknüpfung (Natural Right Outer Join)

Oracle
SELECT * FROM
hr.countries c
NATURAL RIGHT OUTER JOIN hr.regions r
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

REGION_ID

COUNTRY_ID

COUNTRY_NAME

REGION_NAME

5

Ozeanien

4

ZW

Simbabwe

Naher Osten und Afrika

4

ZM

Sambia

Naher Osten und Afrika

2

US

Vereinigte Staaten von Amerika

Amerika

1

UK

Großbritannien

Europa

3

SG

Singapur

Asien

1

NL

Niederlande

Europa

4

NG

Nigeria

Naher Osten und Afrika

2

MX

Mexiko

Amerika

3

ML

Malaysia

Asien

Snowflake
SELECT * FROM
hr.countries c
NATURAL RIGHT OUTER JOIN
hr.regions r
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

REGION_ID

COUNTRY_ID

COUNTRY_NAME

REGION_NAME

5.0000000000000000000

Ozeanien

4.0000000000000000000

ZW

Simbabwe

Naher Osten und Afrika

4.0000000000000000000

ZM

Sambia

Naher Osten und Afrika

2.0000000000000000000

US

Vereinigte Staaten von Amerika

Amerika

1.0000000000000000000

UK

Großbritannien

Europa

3.0000000000000000000

SG

Singapur

Asien

1.0000000000000000000

NL

Niederlande

Europa

4.0000000000000000000

NG

Nigeria

Naher Osten und Afrika

2.0000000000000000000

MX

Mexiko

Amerika

3.0000000000000000000

ML

Malaysia

Asien

3. Basic Outer Join with USING

Tabellenspalten können mit dem Schlüsselwort USING verbunden werden. Die Ergebnisse sind die gleichen wie bei einem einfachen OUTER JOIN mit dem Schlüsselwort ON.

Linker äußere Verknüpfung mit

Oracle
SELECT * FROM
hr.countries c
LEFT OUTER JOIN hr.regions r USING (region_id)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

REGION_ID

COUNTRY_ID

COUNTRY_NAME

REGION_NAME

0

Unbekanntes Land

2

AR

Argentinien

Amerika

3

AU

Australien

Asien

1

BE

Belgien

Europa

2

BR

Brasilien

Amerika

2

CA

Kanada

Amerika

1

CH

Schweiz

Europa

3

CN

China

Asien

1

DE

Deutschland

Europa

1

DK

Dänemark

Europa

Snowflake
SELECT * FROM
hr.countries c
LEFT OUTER JOIN
hr.regions r USING (region_id)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

REGION_ID

COUNTRY_ID

COUNTRY_NAME

REGION_NAME

0.0000000000000000000

Unbekanntes Land

2.0000000000000000000

AR

Argentinien

Amerika

3.0000000000000000000

AU

Australien

Asien

1.0000000000000000000

BE

Belgien

Europa

2.0000000000000000000

BR

Brasilien

Amerika

2.0000000000000000000

CA

Kanada

Amerika

1.0000000000000000000

CH

Schweiz

Europa

3.0000000000000000000

CN

China

Asien

1.0000000000000000000

DE

Deutschland

Europa

1.0000000000000000000

DK

Dänemark

Europa

4. (+) Operator

Oracle und Snowflake haben einen (+)-Operator, der auch für äußere Verknüpfungen verwendet werden kann. In manchen Fällen kann Snowflake bei Verwendung dieses Operators nicht richtig funktionieren.

Weitere Informationen zu diesem Anbieter in Snowflake finden Sie hier.

Linke äußere Verknüpfung mit (+) Operator

Oracle
SELECT * FROM hr.countries c, hr.regions r
WHERE c.region_id = r.region_id(+)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_ID

REGION_NAME

Unbekanntes Land

0

AR

Argentinien

2

2

Amerika

AU

Australien

3

3

Asien

BE

Belgien

1

1

Europa

BR

Brasilien

2

2

Amerika

CA

Kanada

2

2

Amerika

CH

Schweiz

1

1

Europa

CN

China

3

3

Asien

DE

Deutschland

1

1

Europa

DK

Dänemark

1

1

Europa

Snowflake
SELECT * FROM
hr.countries c,
hr.regions r
WHERE c.region_id = r.region_id(+)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_ID

REGION_NAME

Unbekanntes Land

0.0000000000000000000

AR

Argentinien

2.0000000000000000000

2.0000000000000000000

Amerika

AU

Australien

3.0000000000000000000

3.0000000000000000000

Asien

BE

Belgien

1.0000000000000000000

1.0000000000000000000

Europa

BR

Brasilien

2.0000000000000000000

2.0000000000000000000

Amerika

CA

Kanada

2.0000000000000000000

2.0000000000000000000

Amerika

CH

Schweiz

1.0000000000000000000

1.0000000000000000000

Europa

CN

China

3.0000000000000000000

3.0000000000000000000

Asien

DE

Deutschland

1.0000000000000000000

1.0000000000000000000

Europa

DK

Dänemark

1.0000000000000000000

1.0000000000000000000

Europa

Rechte äußere Verknüpfung mit (+) Operator

Oracle
SELECT * FROM hr.countries c, hr.regions r
WHERE c.region_id (+) = r.region_id
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_ID

REGION_NAME

5

Ozeanien

ZW

Simbabwe

4

4

Naher Osten und Afrika

ZM

Sambia

4

4

Naher Osten und Afrika

US

Vereinigte Staaten von Amerika

2

2

Amerika

UK

Großbritannien

1

1

Europa

SG

Singapur

3

3

Asien

NL

Niederlande

1

1

Europa

NG

Nigeria

4

4

Naher Osten und Afrika

MX

Mexiko

2

2

Amerika

ML

Malaysia

3

3

Asien

Snowflake
SELECT * FROM
hr.countries c,
hr.regions r
WHERE c.region_id (+) = r.region_id
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_ID

REGION_NAME

5.0000000000000000000

Ozeanien

ZW

Simbabwe

4.0000000000000000000

4.0000000000000000000

Naher Osten und Afrika

ZM

Sambia

4.0000000000000000000

4.0000000000000000000

Naher Osten und Afrika

US

Vereinigte Staaten von Amerika

2.0000000000000000000

2.0000000000000000000

Amerika

UK

Großbritannien

1.0000000000000000000

1.0000000000000000000

Europa

SG

Singapur

3.0000000000000000000

3.0000000000000000000

Asien

NL

Niederlande

1.0000000000000000000

1.0000000000000000000

Europa

NG

Nigeria

4.0000000000000000000

4.0000000000000000000

Naher Osten und Afrika

MX

Mexiko

2.0000000000000000000

2.0000000000000000000

Amerika

ML

Malaysia

3.0000000000000000000

3.0000000000000000000

Asien

Einzelne Tabelle verbunden mit mehreren Tabellen mit (+)

In Oracle können Sie mit dem Operator (+) eine einzelne Tabelle mit mehreren Tabellen verbinden. Snowflake unterstützt dies jedoch nicht. Abfragen mit dieser Art von äußeren Verknüpfungen werden in die ANSI-Syntax geändert.

Oracle
SELECT
c.country_id,
c.country_name,
r.region_id,
r.region_name,
l.location_id,
l.street_address,
l.postal_code,
l.city
FROM
hr.countries c, hr.regions r,  hr.locations l
WHERE
c.region_id(+) = r.region_id AND
l.country_id = c.country_id(+)
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_NAME

LOCATION_ID

STREET_ADDRESS

POSTAL_CODE

CITY

1

Europa

2000

40-5-12 Laogianggen

190518

Beijing

CH

Schweiz

1

Europa

3000

Murtenstrasse 921

3095

Bern

1

Europa

2100

1298 Vileparle (E)

490231

Mumbai

CH

Schweiz

1

Europa

2900

20 Rue des Corps-Saints

1730

Genf

1

Europa

1300

9450 Kamiya-cho

6823

Hiroshima

UK

Großbritannien

1

Europa

2400

8204 Arthur St

London

1

Europa

3200

Mariano Escobedo 9991

11932

Mexiko-Stadt

DE

Deutschland

1

Europa

2700

Schwanthalerstr. 7031

80925

München

UK

Großbritannien

1

Europa

2500

Magdalen Centre, The Oxford Science Park

OX9-9ZB

Oxford

IT

Italien

1

Europa

1000

1297 Via Cola di Rie

00989

Rom

Snowflake
SELECT
c.country_id,
c.country_name,
r.region_id,
r.region_name,
l.location_id,
l.street_address,
l.postal_code,
l.city
FROM
hr.regions r
CROSS JOIN hr.locations l
LEFT OUTER JOIN
hr.countries c
ON
c.region_id = r.region_id
AND
l.country_id = c.country_id
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_NAME

LOCATION_ID

STREET_ADDRESS

POSTAL_CODE

CITY

1.0000000000000000000

Europa

2000

40-5-12 Laogianggen

190518

Beijing

CH

Schweiz

1.0000000000000000000

Europa

3000

Murtenstrasse 921

3095

Bern

1.0000000000000000000

Europa

2100

1298 Vileparle (E)

490231

Mumbai

CH

Schweiz

1.0000000000000000000

Europa

2900

20 Rue des Corps-Saints

1730

Genf

1.0000000000000000000

Europa

1300

9450 Kamiya-cho

6823

Hiroshima

UK

Großbritannien

1.0000000000000000000

Europa

2400

8204 Arthur St

London

1.0000000000000000000

Europa

3200

Mariano Escobedo 9991

11932

Mexiko-Stadt

DE

Deutschland

1.0000000000000000000

Europa

2700

Schwanthalerstr. 7031

80925

München

UK

Großbritannien

1.0000000000000000000

Europa

2500

Magdalen Centre, The Oxford Science Park

OX9-9ZB

Oxford

IT

Italien

1.0000000000000000000

Europa

1000

1297 Via Cola di Rie

00989

Rom

Verwendung des (+)-Operators mit einer Spalte aus einer nicht verknüpften Tabelle und einem Nicht-Spaltenwert

In Oracle können Sie den Operator (+) mit einer Spalte verwenden und diese mit einem Wert verknüpfen, der keine Spalte aus einer anderen Tabelle ist. Snowflake kann dies auch tun, aber es schlägt fehl, wenn die Tabelle der Spalte nicht mit einer anderen Tabelle verbunden wurde. Um dieses Problem zu lösen, wird der (+)-Operator aus der Abfrage entfernt, wenn dieses Szenario eintritt, und das Ergebnis ist dasselbe wie in Oracle.

Oracle
SELECT * FROM hr.regions r
WHERE
r.region_name (+) LIKE 'A%'
ORDER BY region_id;
Copy
Ergebnis

REGION_ID

REGION_NAME

2

Amerika

3

Asien

Snowflake
SELECT * FROM
hr.regions r
WHERE
r.region_name LIKE 'A%'
ORDER BY region_id;
Copy
Ergebnis

REGION_ID

REGION_NAME

2.0000000000000000000

Amerika

3.0000000000000000000

Asien

Bekannte Probleme

Für alle nicht unterstützten Fälle sehen Sie bitte unter EWIs nach, um Empfehlungen und mögliche Umgehungen zu erhalten.

1. Converted Outer Joins to ANSI syntax might reorder de columns

Wenn eine Abfrage mit einer nicht-ANSI-konformen äußeren Verknüpfung in eine ANSI-konformen äußere Verknüpfung konvertiert wird, kann sich die Reihenfolge der Spalten in der konvertierten Abfrage ändern. Um dieses Problem zu beheben, versuchen Sie, die Spalten in der gewünschten Reihenfolge auszuwählen.

Oracle
SELECT
*
FROM
hr.countries c, hr.regions r,  hr.locations l
WHERE
c.region_id(+) = r.region_id AND
l.country_id = c.country_id(+)
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_ID

REGION_NAME

LOCATION_ID

STREET_ADDRESS

POSTAL_CODE

CITY

STATE_PROVINCE

COUNTRY_ID

1

Europa

2000

40-5-12 Laogianggen

190518

Beijing

CN

CH

Schweiz

1

1

Europa

3000

Murtenstrasse 921

3095

Bern

BE

CH

1

Europa

2100

1298 Vileparle (E)

490231

Mumbai

Maharashtra

IN

CH

Schweiz

1

1

Europa

2900

20 Rue des Corps-Saints

1730

Genf

Genf

CH

1

Europa

1300

9450 Kamiya-cho

6823

Hiroshima

JP

UK

Großbritannien

1

1

Europa

2400

8204 Arthur St

London

UK

1

Europa

3200

Mariano Escobedo 9991

11932

Mexiko-Stadt

Distrito Federal,

MX

DE

Deutschland

1

1

Europa

2700

Schwanthalerstr. 7031

80925

München

Bayern

DE

UK

Großbritannien

1

1

Europa

2500

Magdalen Centre, The Oxford Science Park

OX9-9ZB

Oxford

Oxford

UK

IT

Italien

1

1

Europa

1000

1297 Via Cola di Rie

00989

Rom

IT

Snowflake
SELECT
*
FROM
hr.regions r
CROSS JOIN hr.locations l
LEFT OUTER JOIN
hr.countries c
ON
c.region_id = r.region_id
AND
l.country_id = c.country_id
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

REGION_ID

REGION_NAME

LOCATION_ID

STREET_ADDRESS

POSTAL_CODE

CITY

STATE_PROVINCE

COUNTRY_ID

COUNTRY_ID

COUNTRY_NAME

REGION_ID

1.0000000000000000000

Europa

2000

40-5-12 Laogianggen

190518

Beijing

CN

1.0000000000000000000

Europa

3000

Murtenstrasse 921

3095

Bern

BE

CH

CH

Schweiz

1.0000000000000000000

1.0000000000000000000

Europa

2100

1298 Vileparle (E)

490231

Mumbai

Maharashtra

IN

1.0000000000000000000

Europa

2900

20 Rue des Corps-Saints

1730

Genf

Genf

CH

CH

Schweiz

1.0000000000000000000

1.0000000000000000000

Europa

1300

9450 Kamiya-cho

6823

Hiroshima

JP

1.0000000000000000000

Europa

2400

8204 Arthur St

London

UK

UK

Großbritannien

1.0000000000000000000

1.0000000000000000000

Europa

3200

Mariano Escobedo 9991

11932

Mexiko-Stadt

Distrito Federal,

MX

1.0000000000000000000

Europa

2700

Schwanthalerstr. 7031

80925

München

Bayern

DE

DE

Deutschland

1.0000000000000000000

1.0000000000000000000

Europa

2500

Magdalen Centre, The Oxford Science Park

OX9-9ZB

Oxford

Oxford

UK

UK

Großbritannien

1.0000000000000000000

1.0000000000000000000

Europa

1000

1297 Via Cola di Rie

00989

Rom

IT

IT

Italien

1.0000000000000000000

2. Outer joined between predicate with an interval with multiple tables

Between-Prädikate können für nicht-ANSI OUTER JOINS verwendet werden. In Oracle können Spalten innerhalb des Intervalls mit einer äußeren Verknüpfung werden, auch wenn sie aus verschiedenen Tabellen stammen. Snowflake unterstützt dies jedoch nicht. In diesen Fällen wird das Prädikat BETWEEN auskommentiert.

Oracle
SELECT
*
FROM 
hr.countries c, hr.regions r,  hr.locations l WHERE 
l.location_id  BETWEEN r.region_id(+) AND c.region_id(+)
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Copy
Ergebnis

COUNTRY_ID

COUNTRY_NAME

REGION_ID

REGION_ID

REGION_NAME

LOCATION_ID

STREET_ADDRESS

POSTAL_CODE

CITY

STATE_PROVINCE

COUNTRY_ID

1

Europa

2000

40-5-12 Laogianggen

190518

Beijing

CN

1

Europa

3000

Murtenstrasse 921

3095

Bern

BE

CH

1

Europa

2100

1298 Vileparle (E)

490231

Mumbai

Maharashtra

IN

1

Europa

2900

20 Rue des Corps-Saints

1730

Genf

Genf

CH

1

Europa

1300

9450 Kamiya-cho

6823

Hiroshima

JP

1

Europa

2400

8204 Arthur St

London

UK

1

Europa

3200

Mariano Escobedo 9991

11932

Mexiko-Stadt

Distrito Federal,

MX

1

Europa

2700

Schwanthalerstr. 7031

80925

München

Bayern

DE

1

Europa

2500

Magdalen Centre, The Oxford Science Park

OX9-9ZB

Oxford

Oxford

UK

1

Europa

1000

1297 Via Cola di Rie

00989

Rom

IT

Snowflake
SELECT
*
FROM
hr.countries c,
hr.regions r,
hr.locations l WHERE
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0090 - INVALID NON-ANSI OUTER JOIN BETWEEN PREDICATE CASE FOR SNOWFLAKE. ***/!!!
l.location_id  BETWEEN r.region_id(+) AND c.region_id(+)
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Copy

Zugehörige EWIs

  1. SSC-EWI-OR0090: Nicht-ANSI Outer Join hat ein ungültiges Between-Prädikat.

Selbstverknüpfung (Self Join)

Bemerkung

Einige Teile in den Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Beschreibung

Ein Self-Join ist eine Verknüpfung einer Tabelle mit sich selbst. Diese Tabelle erscheint zweimal in der FROM-Klausel und wird von Tabellenaliasen gefolgt, die Spaltennamen in der Join-Bedingung qualifizieren. (Oracle SQL Language Reference Self Join Subsection)

Beispielhafte Quellcode-Muster

Bemerkung

ORDER BY-Klausel hinzugefügt, da die Reihenfolge der Ergebnisse zwischen Oracle und Snowflake variieren kann.

Bemerkung

Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.

Grundlegender Self-Join-Fall

Oracle
SELECT e1.last_name||' works for '||e2.last_name 
   "Employees and Their Managers"
   FROM hr.employees e1, hr.employees e2 
   WHERE e1.manager_id = e2.employee_id
      AND e1.last_name LIKE 'R%'
   ORDER BY e1.last_name;
Copy
Ergebnis

Mitarbeiter und ihre Vorgesetzten

Rajs arbeitet für Mourgos

Raphaely arbeitet für King

Rogers arbeitet für Kaufling

Russell arbeitet für King

Snowflake
SELECT
   NVL( e1.last_name :: STRING, '') || ' works for ' || NVL(e2.last_name :: STRING, '') "Employees and Their Managers"
FROM
   hr.employees e1,
   hr.employees e2
   WHERE e1.manager_id = e2.employee_id
      AND e1.last_name LIKE 'R%'
   ORDER BY e1.last_name;
Copy
Ergebnis

Mitarbeiter und ihre Vorgesetzten

Rajs arbeitet für Mourgos

Raphaely arbeitet für King

Rogers arbeitet für Kaufling

Russell arbeitet für King

Bemerkung

Wie bereits bewiesen, ist die Selbstverknüpfung (Self Join) in Oracle funktional gleichwertig mit Snowflake.

Bekannte Probleme

Es wurden keine Probleme gefunden.

Zugehörige EWIs

Keine zugehörigen EWIs.

Semijoin

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Beschreibung

Ein Semijoin gibt Zeilen zurück, die einer 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

Prüfen Sie diesen Abschnitt SnowConvert AI – Oracle – Beispieldaten, um die Beispieldatenbank einzurichten.

Grundlegender Semijoin-Fall

Oracle
SELECT * FROM hr.departments 
   WHERE EXISTS 
   (SELECT * FROM hr.employees 
       WHERE departments.department_id = employees.department_id 
       AND employees.salary > 2500)
   ORDER BY department_name;
Copy
Ergebnis

DEPARTMENT_ID

DEPARTMENT_NAME

MANAGER_ID

LOCATION_ID

110

Buchhaltung

205

1700

10

Administration

200

1700

90

Executive

100

1700

100

Finanzen

108

1700

40

Human Resources

203

2400

60

IT

103

1400

20

Marketing

201

1800

70

Public Relations

204

2700

30

Purchasing

114

1700

80

Sales

145

2500

50

Versand

121

1500

Snowflake
SELECT * FROM
   hr.departments
   WHERE EXISTS
   (SELECT * FROM
         hr.employees
       WHERE departments.department_id = employees.department_id
       AND employees.salary > 2500)
   ORDER BY department_name;
Copy
Ergebnis

DEPARTMENT_ID

DEPARTMENT_NAME

MANAGER_ID

LOCATION_ID

110

Buchhaltung

205

1700

10

Administration

200

1700

90

Executive

100

1700

100

Finanzen

108

1700

40

Human Resources

203

2400

60

IT

103

1400

20

Marketing

201

1800

70

Public Relations

204

2700

30

Purchasing

114

1700

80

Sales

145

2500

50

Versand

121

1500

Bemerkung

Wie bereits bewiesen, ist der Semijoin in Oracle funktional äquivalent zu Snowflake.

Bekannte Probleme

Es wurden keine Probleme gefunden.

Zugehörige EWIs

Keine zugehörigen EWIs.