SnowConvert: SELECT-Anweisungen in Oracle

Auswählen

Bemerkung

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

Overall Select Übersetzung

Einfach auswählen

Eingabecode:
 select * from table1;
select col1 from schema1.table1;
Copy
Ausgabecode:
 select * from
table1;

select col1 from
schema1.table1;
Copy

WHERE-Klausel

Eingabecode:
 select col1 from schema1.table1 WHERE col1 = 1 and id > 0 or id < 1;
Copy
Ausgabecode:
 select col1 from
schema1.table1
WHERE col1 = 1 and id > 0 or id < 1;
Copy

ORDER BY-Klausel

Eingabecode:
 select col1 from schema1.table1 order by id ASC;
Copy
Ausgabecode:
 select col1 from
schema1.table1
order by id ASC;
Copy

Group by

Eingabecode:
 select col1 from schema1.table1 GROUP BY id;
Copy
Ausgabecode:
 select col1 from
schema1.table1
GROUP BY id;
Copy

Model-Klausel

Die MODEL-Klausel wird noch nicht unterstützt.

Zeilenbegrenzungsklausel

Eingabecode:
 -- Using ONLY
select * from TableFetch1 FETCH FIRST 2 ROWS ONLY;
select * from TableFetch1 FETCH FIRST 20 percent ROWS ONLY;
select * from TableFetch1 order by col1 FETCH FIRST 2 ROWS with ties;
select * from TableFetch1 order by col1 FETCH FIRST 20 percent ROWS with ties;

-- Using OFFSET clause
select * from TableFetch1 offset 2 rows FETCH FIRST 2 ROWS ONLY;
select * from TableFetch1 offset 2 rows FETCH FIRST 60 percent rows ONLY;
select * from TableFetch1 
order by col1 offset 2 rows FETCH NEXT 2 ROWs with ties;
select * from TableFetch1 
order by col1 offset 2 rows FETCH FIRST 60 percent ROWs with ties;

-- Using WITH TIES clause
select * from TableFetch1 FETCH FIRST 2 ROWS with ties;
select * from TableFetch1 FETCH FIRST 20 percent ROWS with ties;
select * from TableFetch1 offset 2 rows FETCH NEXT 2 ROWs with ties;
select * from TableFetch1 offset 2 rows FETCH FIRST 60 percent ROWs with ties;

-- Using ORDER BY clause
select * from TableFetch1 order by col1 FETCH FIRST 2 ROWS ONLY;
select * from TableFetch1 order by col1 FETCH FIRST 20 percent ROWS ONLY;
select * from TableFetch1 order by col1 offset 2 rows FETCH FIRST 2 ROWS ONLY;
select * from TableFetch1 
order by col1 offset 2 rows FETCH FIRST 60 percent ROWS ONLY;

select * from TableFetch1 FETCH FIRST ROWS ONLY;

select * from TableFetch1 offset 2 rows;
Copy
Ausgabecode:
 -- Using ONLY
select * from
TableFetch1
FETCH FIRST 2 ROWS ONLY;

select * from
TableFetch1
QUALIFY
(ROW_NUMBER() OVER (
ORDER BY
NULL) - 1) / COUNT(*) OVER () < 20 / 100;

select * from
TableFetch1
QUALIFY
RANK() OVER (
order by col1) <= 2;

select * from
TableFetch1
QUALIFY
(RANK() OVER (
order by col1) - 1) / COUNT(*) OVER () < 20 / 100;

-- Using OFFSET clause
select * from
TableFetch1
offset 2 rows FETCH FIRST 2 ROWS ONLY;

select * from
TableFetch1
QUALIFY
(ROW_NUMBER() OVER (
ORDER BY
NULL) - 1 - 2) / COUNT(*) OVER () < 60 / 100
LIMIT NULL OFFSET 2;

select * from
TableFetch1
QUALIFY
RANK() OVER (
order by col1) - 2 <= 2
LIMIT NULL OFFSET 2;

select * from
TableFetch1
QUALIFY
(RANK() OVER (
order by col1) - 1 - 2) / COUNT(*) OVER () < 60 / 100
LIMIT NULL OFFSET 2;

-- Using WITH TIES clause
select * from
TableFetch1
FETCH FIRST 2 ROWS ONLY;

select * from
TableFetch1
QUALIFY
(ROW_NUMBER() OVER (
ORDER BY
NULL) - 1) / COUNT(*) OVER () < 20 / 100;

select * from
TableFetch1
offset 2 rows FETCH NEXT 2 ROWS ONLY;

select * from
TableFetch1
QUALIFY
(ROW_NUMBER() OVER (
ORDER BY
NULL) - 1 - 2) / COUNT(*) OVER () < 60 / 100
LIMIT NULL OFFSET 2;

-- Using ORDER BY clause
select * from
TableFetch1
order by col1
FETCH FIRST 2 ROWS ONLY;

select * from
TableFetch1
QUALIFY
(ROW_NUMBER() OVER (
order by col1) - 1) / COUNT(*) OVER () < 20 / 100;

select * from
TableFetch1
order by col1 offset 2 rows FETCH FIRST 2 ROWS ONLY;

select * from
TableFetch1
QUALIFY
(ROW_NUMBER() OVER (
order by col1) - 1 - 2) / COUNT(*) OVER () < 60 / 100
LIMIT NULL OFFSET 2;

select * from
TableFetch1
FETCH FIRST 1 ROWS ONLY;

select * from
TableFetch1
LIMIT NULL OFFSET 2;
Copy

Bemerkung

In Oracle wird die FETCH / OFFSET WITH TIES ignoriert, wenn in der SELECT kein ORDER BY angegeben ist. Dieser Fall wird in Snowflake mit dem Schlüsselwort ONLY in ein FETCH / OFFSET umgewandelt. Bitte beachten Sie, dass das Schlüsselwort ONLY in Snowflake keine Auswirkung auf die Ergebnisse hat und nur zur besseren Lesbarkeit verwendet wird.

Pivot

Snowflake unterstützt die folgenden Anweisungen nicht:\ - Rename Columns\ - Multiple Columns

Eingabecode:

 select * from schema1.table1
PIVOT(count(*) as count1 FOR (column1, column2) IN (row1 as rowName));
Copy
Ausgabecode:
 select * from
schema1.table1
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
PIVOT (count(*)
                !!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT MULTIPLE COLUMN NOT SUPPORTED ***/!!!
                FOR (column1, column2)
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
IN (row1 as rowName));
Copy

Unpivot

Snowflake unterstützt die folgenden Anweisungen nicht:- INCLUDE / EXCLUDE NULLS

Eingabecode:

select * from schema1.table1 
UNPIVOT INCLUDE NULLS (column1 FOR column2 IN (ANY, ANY)); 
Copy
Ausgabecode:
 select * from
schema1.table1
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT INCLUDE NULLS NOT SUPPORTED ***/!!!
UNPIVOT ( column1 FOR column2 IN (
ANY,
ANY));
Copy

Umwandlung von JOIN (+) in ANSI-Syntax

Diese Übersetzung ist derzeit deaktiviert und dient nur als Referenz für Übersetzungen, die mit früheren Versionen von SnowConvert erstellt wurden. Die aktuelle Übersetzung finden Sie im obigen Abschnitt.

SnowConvert übersetzt die NON-ANSI-konforme Syntax für äußere Verknüpfungen (+) in die ANSI-konforme Syntax für äußere Verknüpfungen um. In diesem Unterabschnitt finden Sie einige Beispiele:

Bis LEFTOUTERJOIN

Beispiel 1:
Input Code:
 -- Additional Params: --OuterJoinsToOnlyAnsiSyntax
SELECT d.department_name,
       e.employee_name      
FROM   departments d, employees e
WHERE  d.department_id = e.department_id (+) 
AND    d.department_id >= 30;
Copy
Output Code:
 SELECT d.department_name,
       e.employee_name
FROM
       departments d
       LEFT OUTER JOIN
              employees e
              ON d.department_id = e.department_id
WHERE
       d.department_id >= 30;
Copy
Beispiel 2:
Input Code:
 -- Additional Params: --OuterJoinsToOnlyAnsiSyntax
SELECT d.department_name,
       e.employee_name      
FROM   departments d, employees e
WHERE  d.department_id(+)  = e.department_id 
AND    d.department_id >= 30;
Copy
Output Code:
 SELECT d.department_name,
       e.employee_name
FROM
       employees e
       LEFT OUTER JOIN
              departments d
              ON d.department_id = e.department_id
WHERE
       d.department_id >= 30;
Copy

Beispiel 3: Mehrfache Verknüpfung

Input Code:
 -- Additional Params: --OuterJoinsToOnlyAnsiSyntax
SELECT d.department_name,
       e.employee_name      
FROM   departments d, employees e, projects p
WHERE  e.department_id(+) = d.department_id
AND    p.department_id(+) = d.department_id
AND    d.department_id >= 30;
Copy
Output Code:
 SELECT d.department_name,
       e.employee_name
FROM
       departments d
       LEFT OUTER JOIN
              employees e
              ON e.department_id = d.department_id
       LEFT OUTER JOIN
              projects p
              ON p.department_id = d.department_id
WHERE
       d.department_id >= 30;
Copy

Beispiel 4: Verknüpfung mit anderen Arten von Bedingungen

Input Code:
 -- Additional Params: --OuterJoinsToOnlyAnsiSyntax
SELECT d.department_name,
       e.employee_name      
FROM   departments d, employees e
WHERE  d.department_id(+)  = e.department_id 
AND    d.location(+) IN ('CHICAGO', 'BOSTON', 'NEW YORK')
AND    d.department_id >= 30;
Copy
Output Code:
 SELECT d.department_name,
       e.employee_name
FROM
       employees e
       LEFT OUTER JOIN
              departments d
              ON d.department_id = e.department_id
              AND d.location IN ('CHICAGO', 'BOSTON', 'NEW YORK')
WHERE
       d.department_id >= 30;
Copy

Beispiel 5: Verbinden mit (+) innerhalb einer Funktion

Input Code:
 -- Additional Params: --OuterJoinsToOnlyAnsiSyntax
SELECT d.department_name,
       e.employee_name
FROM   departments d, employees e
WHERE SUBSTR(d.department_name, 1, NVL(e.department_id, 1) ) = e.employee_name(+);
Copy
Output Code:
 SELECT d.department_name,
       e.employee_name
FROM
       departments d
       LEFT OUTER JOIN
              employees e
              ON SUBSTR(d.department_name, 1, NVL(e.department_id, 1) ) = e.employee_name;
Copy

Warnung

Bitte beachten Sie, dass einige der Muster, die in LEFT OUTER JOIN übersetzt wurden, die Zeilen in einer anderen Reihenfolge abrufen können.

Bis CROSSJOIN

Beispiel 6: Komplexer Fall, der die Verwendung von CROSS JOIN erfordert

Eingabecode:
-- Additional Params: --OuterJoinsToOnlyAnsiSyntax
SELECT d.department_name,
       e.employee_name,
       p.project_name,
       c.course_name 
FROM   departments d, employees e, projects p, courses c
WHERE
e.salary (+) >= 2000 AND
d.department_id = e.department_id (+)
AND p.department_id = e.department_id(+)
AND c.course_id  = e.department_id(+)
AND d.department_id >= 30;
Copy
Ausgabecode:
 SELECT d.department_name,
       e.employee_name,
       p.project_name,
       c.course_name
FROM
       departments d
       CROSS JOIN projects p
       CROSS JOIN courses c
       LEFT OUTER JOIN
              employees e
              ON
              e.salary >= 2000
              AND
              d.department_id = e.department_id
              AND p.department_id = e.department_id
              AND c.course_id  = e.department_id
WHERE
       d.department_id >= 30;
Copy

Hierarchische Abfragen

Hierarchische Abfragen in Snowflake ermöglichen es, Daten in einer baumartigen Struktur zu organisieren und abzurufen, typischerweise unter Verwendung der CONNECT BY-Klausel. Diese Klausel verknüpft eine Tabelle mit sich selbst, um hierarchische Daten in der Tabelle zu verarbeiten.

Eingabecode:

 SELECT employee_ID, manager_ID, title
FROM employees
START WITH manager_ID = 1
CONNECT BY manager_ID = PRIOR employee_id;
Copy
Ausgabecode:
 SELECT employee_ID, manager_ID, title
FROM
employees
START WITH manager_ID = 1
CONNECT BY
manager_ID = PRIOR employee_id;
Copy

Flashback-Abfrage auswählen

select-flashback-query.md

Flashback-Abfrage auswählen

Beschreibung

Oracle

Die Flashback-Abfrage in Oracle ruft vergangene Daten aus einer Tabelle, Ansicht oder materialisierten Ansicht ab. In Oracle kann sie unter anderem für folgende Zwecke verwendet werden:

  • Wiederherstellen von gelöschten Daten oder Rückgängigmachen eines falschen Commits, Vergleichen von aktuellen Daten mit den entsprechenden Daten zu einem früheren Zeitpunkt, Überprüfen des Zustands von Transaktionsdaten zu einem bestimmten Zeitpunkt und Tools zur Erstellung von Berichten zu vergangenen Daten, um nur einige zu nennen. (Oracle Flashback Abfrage-Dokumentation).

Snowflake

Der entsprechende Mechanismus in Snowflake zur Abfrage von Daten aus der Vergangenheit ist die Abfrage AT | BEGIN. Beachten Sie, dass das einzige Äquivalent für die AS OF-Anweisungen ist.

Darüber hinaus verfügt Snowflake über eine vollständige „Time Travel“-Dokumentation, die das Abfragen von Daten zum Klonen von Objekten wie Tabellen, Ansichten und Schemata ermöglicht. Es gibt eine Beschränkung der Tage, an denen Sie auf vergangene oder gelöschte Daten zugreifen können (90 Tage vor dem Übergang in den Fail-safe-Status). Weitere Informationen finden Sie in der Snowflake Time Travel-Dokumentation.

Oracle-Syntax

 { VERSIONS BETWEEN
  { SCN | TIMESTAMP }
  { expr | MINVALUE } AND { expr | MAXVALUE }
| AS OF { SCN | TIMESTAMP } expr
}
Copy

Snowflake-Syntax

 SELECT ...
FROM ...
  {
   AT( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' } ) |
   BEFORE( STATEMENT => <id> )
  }
[ ... ]
Copy

Bemerkung

Beachten Sie, dass die Abfrage ID auf eine Abfrage verweisen muss, die innerhalb von 14 Tagen ausgeführt wurde. Wenn die Abfrage ID auf eine Abfrage verweist, die älter als 14 Tage ist, wird der folgende Fehler zurückgegeben: Fehler: Anweisung <query_id> nicht gefunden. Um diese Einschränkung zu umgehen, verwenden Sie den Zeitstempel für die referenzierte Abfrage. (Snowflake AT | Vor der Dokumentation)

Beispielhafte Quellcode-Muster

In den folgenden Beispielen werden die folgenden Daten verwendet, um die Abfrageausgaben zu generieren.

 CREATE TABLE Employee (
    EmployeeID NUMBER PRIMARY KEY,
    FirstName VARCHAR2(50),
    LastName VARCHAR2(50),
    EmailAddress VARCHAR2(100),
    HireDate DATE,
    SalaryAmount NUMBER(10, 2)
);

INSERT INTO Employee VALUES (1, 'Bob', 'SampleNameA', 'sample@example.com', TO_DATE('2023-01-15', 'YYYY-MM-DD'), 11111.00);
INSERT INTO Employee VALUES (2, 'Bob', 'SampleNameB', 'sample@example.com', TO_DATE('2023-01-15', 'YYYY-MM-DD'), 11111.00);
INSERT INTO Employee VALUES (3, 'Bob', 'SampleNameC', 'sample@example.com', TO_DATE('2022-03-10', 'YYYY-MM-DD'), 11111.00);
INSERT INTO Employee VALUES (4, 'Bob', 'SampleNameD', 'sample@example.com', TO_DATE('2022-03-10', 'YYYY-MM-DD'), 11111.00);
INSERT INTO Employee VALUES (5, 'Bob', 'SampleNameE', 'sample@example.com', TO_DATE('2022-03-10', 'YYYY-MM-DD'), 11111.00);
Copy
 CREATE OR REPLACE TABLE Employee (
       EmployeeID NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ PRIMARY KEY,
       FirstName VARCHAR(50),
       LastName VARCHAR(50),
       EmailAddress VARCHAR(100),
       HireDate TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/,
       SalaryAmount NUMBER(10, 2) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/
   )
   COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
   ;

   INSERT INTO Employee
   VALUES (1, 'Bob', 'SampleNameA', 'sample@example.com', TO_DATE('2023-01-15', 'YYYY-MM-DD'), 11111.00);

   INSERT INTO Employee
   VALUES (2, 'Bob', 'SampleNameB', 'sample@example.com', TO_DATE('2023-01-15', 'YYYY-MM-DD'), 11111.00);

   INSERT INTO Employee
   VALUES (3, 'Bob', 'SampleNameC', 'sample@example.com', TO_DATE('2022-03-10', 'YYYY-MM-DD'), 11111.00);

   INSERT INTO Employee
   VALUES (4, 'Bob', 'SampleNameD', 'sample@example.com', TO_DATE('2022-03-10', 'YYYY-MM-DD'), 11111.00);

   INSERT INTO Employee
   VALUES (5, 'Bob', 'SampleNameE', 'sample@example.com', TO_DATE('2022-03-10', 'YYYY-MM-DD'), 11111.00);
Copy

1. AS OF with TIMESTAMP case

Oracle

 SELECT * FROM employees
AS OF TIMESTAMP
TO_TIMESTAMP('2023-09-27 07:00:00', 'YYYY-MM-DD HH:MI:SS')
WHERE last_name = 'SampleName';
Copy

Snowflake

 SELECT * FROM
employees
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0135 - DATA RETENTION PERIOD MAY PRODUCE NO RESULTS ***/!!!
AT (TIMESTAMP =>
TO_TIMESTAMP('2023-09-27 07:00:00', 'YYYY-MM-DD HH:MI:SS'))
WHERE last_name = 'SampleName';
Copy

2. AS OF with SCN case

Oracle

 SELECT * FROM employees
AS OF SCN
TO_TIMESTAMP('2023-09-27 07:00:00', 'YYYY-MM-DD HH:MI:SS')
WHERE last_name = 'SampleName';
Copy

Snowflake

 SELECT * FROM
employees
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
AS OF SCN
TO_TIMESTAMP('2023-09-27 07:00:00', 'YYYY-MM-DD HH:MI:SS')
WHERE last_name = 'SampleName';
Copy

Bekannte Probleme

1. The option when it is using SCN is not supported.

2. The VERSION statement is not supported in Snowflake.

Zugehörige EWIS

  1. [SSC-EWI-0040](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0040): Anweisung wird nicht unterstützt.

  2. [SSC-EWI-OR0135](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/oracleEWI. md#ssc-ewi-or0135): Die aktuelle Klausel wird in Snowflake nicht unterstützt.

  3. [SSC-FDM-0006](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/generalFDM. md#ssc-fdm-0006): Zahlentyp-Spalte verhält sich in Snowflake möglicherweise nicht ähnlich.

  4. [SSC-FDM-OR0042](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/oracleFDM. md#ssc-fdm-or0042): In Zeitstempel umgewandelter Datumstyp zeigt eine andere Verhaltensweise