SnowConvert AI - Sybase IQ - SELECT¶
설명¶
데이터베이스에서 정보를 검색합니다. (Sybase SQL 언어 참조)
경고
이 구문은 Snowflake에서 부분적으로 지원됩니다.
문법 구문¶
SELECT
[ ALL | DISTINCT ]
[ row-limitation-option1 ]
select-list
… [ INTO { host-variable-list | variable-list | table-name } ]
… [ INTO LOCAL TEMPORARY TABLE { table-name } ]
… [ FROM table-list ]
… [ WHERE search-condition ]
… [ GROUP BY [ expression [, ...]
| ROLLUP ( expression [, ...] )
| CUBE ( expression [, ...] ) ] ]
… [ HAVING search-condition ]
… [ ORDER BY { expression | integer } [ ASC | DESC ] [, ...] ]
| [ FOR JSON json-mode ]
… [ row-limitation-option ]
select-list:
{ column-name
| expression [ [ AS ] alias-name ]
| *
}
row-limitation-option1:
FIRST
| TOP {ALL | limit-expression} [START AT startat-expression ]
limit-expression:
simple-expression
startat-expression:
simple-expression
row-limitation-option2:
LIMIT { [ offset-expression, ] limit-expression
| limit-expression OFFSET offset-expression }
offset-expression:
simple-expression
simple-expression:
integer
| variable
| ( simple-expression )
| ( simple-expression { + | - | * } simple-expression )
..FROM <table-expression> [,...]
<table-expression> ::=
<table-name>
| <view-name>
| <procedure-name>
| <common-table-expression>
| ( <subquery> ) [ [ AS ] <derived-table-name> ( <column_name, ...>) ] ]
| <derived-table>
| <join-expression>
| ( <table-expression> , ... )
| <openstring-expression>
| <apply-expression>
| <contains-expression>
| <dml-derived-table>
<table-name> ::=
[ <userid>.] <table-name> ]
[ [ AS ] <correlation-name> ]
[ FORCE INDEX ( <index-name> ) ]
<view-name> ::=
[ <userid>.]<view-name> [ [ AS ] <correlation-name> ]
<procedure-name> ::=
[ <owner>, ] <procedure-name> ([ <parameter>, ...])
[ WITH(<column-name datatype>, )]
[ [ AS ] <correlation-name> ]
<parameter> ::=
<scalar-expression> | <table-parameter>
<table-parameter> ::=
TABLE (<select-statement)> [ OVER ( <table-parameter-over> )]
<table-parameter-over> ::=
[ PARTITION BY {ANY
| NONE|< table-expression> } ]
[ ORDER BY { <expression> | <integer> }
[ ASC | DESC ] [, ...] ]
<derived-table> ::=
( <select-statement> )
[ AS ] <correlation-name> [ ( <column-name>, ... ) ]
<join-expression> ::=
<table-expression> <join-operator> <table-expression>
[ ON <join-condition> ]
<join-operator> ::=
[ KEY | NATURAL ] [ <join-type> ] JOIN | CROSS JOIN
<join-type> ::=
INNER
| LEFT [ OUTER ]
| RIGHT [ OUTER ]
| FULL [ OUTER ]
<openstring-expression> ::=
OPENSTRING ( { FILE | VALUE } <string-expression> )
WITH ( <rowset-schema> )
[ OPTION ( <scan-option> ... ) ]
[ AS ] <correlation-name>
<apply-expression> ::=
<table-expression> { CROSS | OUTER } APPLY <table-expression>
<contains-expression> ::=
{ <table-name> | <view-name> } CONTAINS
( <column-name> [,...], <contains-query> )
[ [ AS ] <score-correlation-name> ]
<rowset-schema> ::=
<column-schema-list>
| TABLE [<owner>.]<table-name> [ ( <column-list> ) ]
<column-schema-list> ::=
{ <column-name user-or-base-type> | filler( ) } [ , ... ]
<column-list> ::=
{ <column-name> | filler( ) } [ , ... ]
<scan-option> ::=
BYTE ORDER MARK { ON | OFF }
| COMMENTS INTRODUCED BY <comment-prefix>
| DELIMITED BY <string>
| ENCODING <encoding>
| ESCAPE CHARACTER <character>
| ESCAPES { ON | OFF }
| FORMAT { TEXT | BCP }
| HEXADECIMAL { ON | OFF }
| QUOTE <string>
| QUOTES { ON | OFF }
| ROW DELIMITED BY string
| SKIP <integer>
| STRIP { ON | OFF | LTRIM | RTRIM | BOTH }
<contains-query> ::= <string>
<dml-derived-table> ::=
( <dml-statement> ) REFERENCING ( [ <table-version-names> | NONE ] )
<dml-statement> ::=
<insert-statement>
<update-statement>
<delete-statement>
<table-version-names> ::=
OLD [ AS ] <correlation-name> [ FINAL [ AS ] <correlation-name> ]
| FINAL [ AS ] <correlation-name>
샘플 소스 패턴¶
행 제한 사항¶
Sybase는 TOP 절을 START AT과 함께 사용하여 쿼리에서 행 제한을 허용하지만, Snowflake는 이를 지원하지 않으므로 아래와 같이 변환하여 동일한 기능을 구현할 수 있습니다.
입력 코드:¶
Sybase¶
SELECT
TOP 10 START AT 2
COL1
FROM TABLE1;
SELECT
FIRST
COL1
FROM TABLE1;
SELECT
COL1
FROM TABLE1
LIMIT 2, 1;
SELECT
COL1
FROM TABLE1
LIMIT 1 OFFSET 2;
출력 코드:¶
Snowflake¶
SELECT
COL1
FROM
TABLE1
LIMIT 10 OFFSET 2;
SELECT
TOP 1
COL1
FROM
TABLE1;
SELECT
COL1
FROM
TABLE1
LIMIT 1 OFFSET 2;
SELECT
COL1
FROM
TABLE1
LIMIT 1 OFFSET 2;
Into 절¶
Sybase에서는 여러 행을 선택하고 검색된 날짜를 저장할 이름을 정의하여 테이블을 정의할 수 있습니다. Snowflake는 이 동작을 지원하지 않지만 CREATE TABLE AS를 수행하여 에뮬레이션할 수 있습니다.
입력 코드:¶
Sybase¶
SELECT
* INTO mynewtable
FROM TABLE1;
SELECT
* INTO LOCAL TEMPORARY TABLE mynewtable
FROM TABLE1;
SELECT
* INTO #mynewtable
FROM TABLE1;
출력 코드:¶
Snowflake¶
CREATE OR REPLACE TABLE mynewtable AS
SELECT
*
FROM
TABLE1;
CREATE OR REPLACE TEMPORARY TABLE mynewtable AS
SELECT
*
FROM
TABLE1;
CREATE OR REPLACE TEMPORARY TABLE T_mynewtable AS
SELECT
*
FROM
TABLE1;
인덱스 적용¶
Snowflake에는 쿼리 최적화를 위한 인덱스가 포함되어 있지 않습니다.
입력 코드:¶
Sybase¶
SELECT * FROM MyTable FORCE INDEX (MyIndex);
출력 코드:¶
Snowflake¶
SELECT
*
FROM
MyTable
-- --** SSC-FDM-SY0002 - FORCE INDEX IS NOT SUPPORTED IN SNOWFLAKE **
-- FORCE INDEX (MyIndex)
;
TABLE FUNCTIONS¶
Snowflake는 저장 프로시저(프로시저가 특정 제한을 충족하는 경우) 또는 FROM 절에서 테이블 값 함수를 호출할 수 있지만, RESULTSETS 및 윈도우는 매개 변수로 사용할 수 없습니다.
입력 코드:¶
Sybase¶
SELECT * FROM
MyProcedure(TABLE (SELECT * FROM TABLE1));
SELECT * FROM MyProcedure(1, 'test');
SELECT * FROM
MyProcedure(
TABLE (SELECT * FROM TABLE1)
OVER (PARTITION BY Col1 ORDER BY Col2 DESC));
SELECT * FROM
MyProcedure(
TABLE (SELECT * FROM AnotherTable) );
출력 코드:¶
Snowflake¶
SELECT
*
FROM
TABLE(MyProcedure(
!!!RESOLVE EWI!!! /*** SSC-EWI-SY0004 - UNSUPPORTED SYNTAX TABLE FUNCTION CAN'T RECEIVE A QUERY AS PARAMETER ***/!!!TABLE (SELECT * FROM TABLE1)));
SELECT
*
FROM
TABLE(MyProcedure(1, 'test'));
SELECT
*
FROM
TABLE(MyProcedure(
!!!RESOLVE EWI!!! /*** SSC-EWI-SY0004 - UNSUPPORTED SYNTAX TABLE FUNCTION CAN'T RECEIVE A QUERY AS PARAMETER ***/!!!
TABLE (SELECT * FROM TABLE1)
!!!RESOLVE EWI!!! /*** SSC-EWI-SY0005 - UNSUPPORTED SYNTAX TABLE FUNCTION CAN'T BE USED WITH OVER EXPRESSION ***/!!!
OVER (PARTITION BY Col1 ORDER BY Col2 DESC)));
SELECT
*
FROM
TABLE(MyProcedure(
!!!RESOLVE EWI!!! /*** SSC-EWI-SY0004 - UNSUPPORTED SYNTAX TABLE FUNCTION CAN'T RECEIVE A QUERY AS PARAMETER ***/!!!
TABLE (SELECT * FROM AnotherTable) ));
OPEN STRING¶
Snowflake는 OPENSTRING 기능을 지원하지 않습니다.
입력 코드:¶
Sybase¶
-- Openstring from file
SELECT * FROM
OPENSTRING (FILE '/path/to/file.txt')
WITH (Col1 INT, Col2 VARCHAR(20)) AS OS;
-- Openstring from value
SELECT * FROM
OPENSTRING (VALUE '1,test')
WITH (Col1 INT, Col2 VARCHAR(20)) AS OS;
-- Openstring with options
SELECT * FROM
OPENSTRING (FILE '/path/to/file.csv')
WITH (Col1 INT, Col2 VARCHAR(20))
OPTION (DELIMITED BY ',' QUOTE '"') AS OS;
출력 코드:¶
Snowflake¶
-- Openstring from file
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-SY0006 - OPEN STRING IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
OPENSTRING (FILE '/path/to/file.txt')
WITH (Col1 INT, Col2 VARCHAR(20)) AS OS;
-- Openstring from value
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-SY0006 - OPEN STRING IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
OPENSTRING (VALUE '1,test')
WITH (Col1 INT, Col2 VARCHAR(20)) AS OS;
-- Openstring with options
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-SY0006 - OPEN STRING IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
OPENSTRING (FILE '/path/to/file.csv')
WITH (Col1 INT, Col2 VARCHAR(20))
OPTION (DELIMITED BY ',' QUOTE '"') AS OS;
DML 파생 테이블¶
Sybase에서는 실행 중에 dml 파생 테이블에 지정된 DML 문이 먼저 실행되며, 해당 DML의 영향을 받는 행은 REFERENCING 절에 의해 설명되는 열이 있는 임시 테이블로 구체화됩니다. 임시 테이블은 dml 파생 테이블의 결과 세트를 나타냅니다. Snowflake는 이 동작을 지원하지 않습니다.
입력 코드:¶
Sybase¶
-- DML derived table with insert
SELECT * FROM (INSERT INTO TargetTable (Col1, Col2) VALUES (1, 'test')) REFERENCING (FINAL AS F);
-- DML derived table with update
SELECT * FROM (UPDATE TargetTable SET Col2 = 'updated' WHERE Col1 = 1) REFERENCING (OLD AS O FINAL AS F);
-- DML derived table with delete
SELECT * FROM (DELETE FROM TargetTable WHERE Col1 = 1) REFERENCING (OLD AS O);
출력 코드:¶
Snowflake¶
-- DML derived table with insert
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-SY0007 - DML DERIVED TABLE NOT SUPPORTED IN SNOWFLAKE ***/!!! (INSERT INTO TargetTable (Col1, Col2) VALUES (1, 'test')) REFERENCING (FINAL AS F);
-- DML derived table with update
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-SY0007 - DML DERIVED TABLE NOT SUPPORTED IN SNOWFLAKE ***/!!! (UPDATE TargetTable SET Col2 = 'updated' WHERE Col1 = 1) REFERENCING (OLD AS O FINAL AS F);
-- DML derived table with delete
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-SY0007 - DML DERIVED TABLE NOT SUPPORTED IN SNOWFLAKE ***/!!! (DELETE FROM TargetTable WHERE Col1 = 1) REFERENCING (OLD AS O);
KEY JOIN¶
Snowflake는 KEY 조인을 지원하지 않지만 ON CLAUSE가 쿼리에 정의된 경우 KEY 키워드가 제거되고 그렇지 않으면 EWI가 삽입됩니다.
입력 코드:¶
Sybase¶
SELECT * FROM Table1 KEY JOIN Table2;
SELECT * FROM Table1 KEY JOIN Table2 ON Table1.ID = Table2.ID;
출력 코드:¶
Snowflake¶
SELECT
*
FROM
Table1
!!!RESOLVE EWI!!! /*** SSC-EWI-SY0009 - KEY JOIN NOT SUPPORTED IN SNOWFLAKE ***/!!!
KEY JOIN
Table2;
SELECT
*
FROM
Table1
JOIN
Table2
ON Table1.ID = Table2.ID;
OUTER-CROSS APPLY¶
Snowflake는 절 CROSS APPLY를 LEFT OUTER JOIN으로, OUTER APPLY를 INNER JOIN으로 변환합니다.
입력 코드:¶
Sybase¶
-- Apply cross apply
SELECT * FROM Table1 CROSS APPLY (SELECT Col2 FROM Table2 WHERE Table1.ID = Table2.ID) AS AP;
-- Apply outer apply
SELECT * FROM Table1 OUTER APPLY (SELECT Col2 FROM Table2 WHERE Table1.ID = Table2.ID) AS AP;
출력 코드:¶
Snowflake¶
-- Apply cross apply
SELECT
*
FROM
Table1
LEFT OUTER JOIN (
SELECT
Col2
FROM
Table2
WHERE
Table1.ID = Table2.ID
) AS AP;
-- Apply outer apply
SELECT
*
FROM
Table1
INNER JOIN LATERAL (
SELECT
Col2
FROM
Table2
WHERE
Table1.ID = Table2.ID
) AS AP;
CONTAINS 절¶
Sybase에서는 테이블 이름 뒤에 CONTAINS 절을 사용하여 테이블을 필터링하고 contains 쿼리로 지정된 전체 텍스트 쿼리와 일치하는 행만 반환합니다. 테이블에서 일치하는 모든 행은 점수-상관 관계-이름을 사용하여 참조할 수 있는 점수 열과 함께 반환됩니다. Snowflake는 이 동작을 지원하지 않습니다.
입력 코드:¶
Sybase¶
-- Contains clause
SELECT * FROM MyTable CONTAINS (TextColumn, 'search term') AS Score;
-- Contains clause with multiple columns.
SELECT * FROM MyTable CONTAINS (TextColumn,TextColumn2, 'search term') AS Score;
출력 코드:¶
Snowflake¶
-- Contains clause
SELECT
*
FROM
MyTable
!!!RESOLVE EWI!!! /*** SSC-EWI-SY0008 - CONTAINS CLAUSE NOT SUPPORTED IN SNOWFLAKE ***/!!!
CONTAINS (TextColumn, 'search term') AS Score;
-- Contains clause with multiple columns.
SELECT
*
FROM
MyTable
!!!RESOLVE EWI!!! /*** SSC-EWI-SY0008 - CONTAINS CLAUSE NOT SUPPORTED IN SNOWFLAKE ***/!!!
CONTAINS (TextColumn,TextColumn2, 'search term') AS Score;