복붙노트

[SQL] 어떻게 상수 가득 여러 행을 선택하려면?

SQL

어떻게 상수 가득 여러 행을 선택하려면?

테이블을 참조하지 않고 상수를 선택하면 SQL 문에 완벽하게 합법적이다 :

SELECT 1, 2, 3

그 결과, 후자의 리턴 값을 포함하는 하나의 행임을 설정. , 뭔가 가지를 일정한 식을 사용하여 한 번에 여러 행을 선택하는 방법이 있는지 궁금 해서요 :

SELECT ((1, 2, 3), (4, 5, 6), (7, 8, 9))

나는 그 작품 반환 위의 같은 3 행 3 열이있는 결과 세트를 원하는 것입니다.

해결법

  1. ==============================

    1.

    SELECT 1, 2, 3
    UNION ALL SELECT 4, 5, 6
    UNION ALL SELECT 7, 8, 9
    
  2. ==============================

    2.PostgreSQL을, 당신은 할 수 있습니다 :

    PostgreSQL을, 당신은 할 수 있습니다 :

    SELECT  *
    FROM    (
            VALUES
            (1, 2),
            (3, 4)
            ) AS q (col1, col2)
    

    다른 시스템에서, 단지 UNION ALL을 사용합니다 :

    SELECT  1 AS col1, 2 AS col2
    -- FROM    dual
    -- uncomment the line above if in Oracle
    UNION ALL
    SELECT  3 AS col1, 3 AS col2
    -- FROM    dual
    -- uncomment the line above if in Oracle
    

    오라클, SQL Server 및 PostgreSQL을, 당신은 또한 행 (외부 변수로 제공 가능)의 임의의 수의 레코드를 생성 할 수 있습니다 :

    SELECT  level
    FROM    dual
    CONNECT BY
            level <= :n
    

    오라클,

    WITH    q (l) AS
            (
            SELECT  1
            UNION ALL
            SELECT  l + 1
            FROM    q
            WHERE   l < @n
            )
    SELECT  l
    FROM    q
    -- OPTION (MAXRECURSION 0)
    -- uncomment line above if @n >= 100
    

    SQL 서버에서,

    SELECT  l
    FROM    generate_series(1, $n) l
    

    PostgreSQL을한다.

  3. ==============================

    3.베어 VALUES는 PostgreSQL을에 나를 위해 일을 명령에 따라 :

    베어 VALUES는 PostgreSQL을에 나를 위해 일을 명령에 따라 :

    VALUES (1,2,3), (4,5,6), (7,8,9)
    
  4. ==============================

    4.오라클의 조항에 의해 이런 식으로 뭔가를 연결 시도

    오라클의 조항에 의해 이런 식으로 뭔가를 연결 시도

    select level,level+1,level+2 from dual connect by level <=3;
    

    oraclebin 사이트는 이제 악성이기 때문에 제거 된 URL : 절에 의해 연결에 대한 자세한 내용은이 링크를 따르십시오.

  5. ==============================

    5.마이크로 소프트 SQL Server 또는 PostgreSQL을 위해 당신은이 구문을 시도 할 수 있습니다

    마이크로 소프트 SQL Server 또는 PostgreSQL을 위해 당신은이 구문을 시도 할 수 있습니다

    FROM SELECT 상수 (VALUES ( 'foo@gmail.com') ( 'bar@gmail.com') ( 'baz@gmail.com'))을 MyTable AS (상수)

    또한 여기에 SQL 바이올린을 볼 수 있습니다 http://www.sqlfiddle.com/#!17/9eecb/34703/0

  6. ==============================

    6.신탁. 이 게시물에 대한 감사는 PL / SQL - 어디에서 절에 사용 "목록"변수

    신탁. 이 게시물에 대한 감사는 PL / SQL - 어디에서 절에 사용 "목록"변수

    나는 쉽게 수동으로 입력 값 (테스터하여 응용 프로그램을 테스트에서 재사용되는)에 함께 내 예를 들어 문을 넣어 :

    WITH prods AS (
        SELECT column_value AS prods_code 
        FROM TABLE(
            sys.odcivarchar2list(
                'prod1', 
                'prod2'
            )
        )
    )
    SELECT * FROM prods
    
  7. ==============================

    7.

    SELECT * 
    FROM DUAL 
    CONNECT BY ROWNUM <= 9;
    
  8. ==============================

    8.여기에 내가 깔끔한 XML 트릭을 사용하여 Oracle 10 + 정적 데이터를 채우는 방법이다.

    여기에 내가 깔끔한 XML 트릭을 사용하여 Oracle 10 + 정적 데이터를 채우는 방법이다.

    create table prop
    (ID NUMBER,
     NAME varchar2(10),
     VAL varchar2(10),
     CREATED timestamp,
     CONSTRAINT PK_PROP PRIMARY KEY(ID)
    );
    
    merge into Prop p
    using (
    select 
      extractValue(value(r), '/R/ID') ID,
      extractValue(value(r), '/R/NAME') NAME,
      extractValue(value(r), '/R/VAL') VAL
    from
    (select xmltype('
    <ROWSET>
       <R><ID>1</ID><NAME>key1</NAME><VAL>value1</VAL></R>
       <R><ID>2</ID><NAME>key2</NAME><VAL>value2</VAL></R>
       <R><ID>3</ID><NAME>key3</NAME><VAL>value3</VAL></R>
    </ROWSET>
    ') xml from dual) input,
     table(xmlsequence(input.xml.extract('/ROWSET/R'))) r
    ) p_new
    on (p.ID = p_new.ID)
    when not matched then
    insert
    (ID, NAME, VAL, CREATED)
    values
    ( p_new.ID, p_new.NAME, p_new.VAL, SYSTIMESTAMP );
    

    병합은 편리 원래 테이블에 누락 된 행을 삽입 당신은 당신의 삽입 스크립트를 다시 실행하십시오.

  9. ==============================

    9.DB2에 대한 옵션 :

    DB2에 대한 옵션 :

    SELECT 101 AS C1, 102 AS C2 FROM SYSIBM.SYSDUMMY1 UNION ALL
    SELECT 201 AS C1, 202 AS C2 FROM SYSIBM.SYSDUMMY1 UNION ALL
    SELECT 301 AS C1, 302 AS C2 FROM SYSIBM.SYSDUMMY1
    
  10. ==============================

    10.오라클

    오라클

    SELECT
      CASE
        WHEN level = 1
        THEN 'HI'
        WHEN level = 2
        THEN 'BYE'
      END TEST
    FROM dual
      CONNECT BY level <= 2;
    
  11. ==============================

    11.다음은 DB2의 XML 기능을 사용하여 수행하는 방법이다

    다음은 DB2의 XML 기능을 사용하여 수행하는 방법이다

    SELECT *
    FROM
    XMLTABLE ('$doc/ROWSET/ROW' PASSING XMLPARSE ( DOCUMENT '
    <ROWSET>
      <ROW>
        <A val="1" /> <B val="2" /> <C val="3" />
      </ROW>
      <ROW>
        <A val="4" /> <B val="5" /> <C val="6" />
      </ROW>
      <ROW>
        <A val="7" /> <B val="8" /> <C val="9" />
      </ROW>
    </ROWSET>
    ') AS "doc"
       COLUMNS 
          "A" INT PATH 'A/@val',
          "B" INT PATH 'B/@val',
          "C" INT PATH 'C/@val'
    ) 
    AS X
    ;
    
  12. ==============================

    12.당신을 도울 수있는이 방법

    당신을 도울 수있는이 방법

    SELECT   TOP 3
             1 AS First, 
             2 AS Second, 
             3 AS Third 
    FROM     Any_Table_In_Your_DataBase
    

    Any_Table_In_Your_DataBase : 3 개 이상의 레코드를 포함, 또는 시스템 테이블을 사용하는 테이블. 여기에서 우리는 그 테이블의 데이터 염려가 없습니다.

    당신은 Any_Table_In_Your_DataBase 테이블에서 제 1, 제 2, 제 3 열이있는 열을 연결하여 결과 집합의 변화를 가져올 수 있습니다.

  13. ==============================

    13.MySQL은, 당신은 할 수 있습니다 : 값 (1, 2), (3, 4);

    MySQL은, 당신은 할 수 있습니다 : 값 (1, 2), (3, 4);

    mysql> values (1,2), (3, 4);
    +---+---+
    | 1 | 2 |
    +---+---+
    | 1 | 2 |
    | 3 | 4 |
    +---+---+
    2 rows in set (0.004 sec)
    

    MySQL은 8, 열 이름을 지정하는 것도 가능합니다 :

    mysql> SELECT * FROM (SELECT 1, 2, 3, 4) AS dt (a, b, c, d);
    +---+---+---+---+
    | a | b | c | d |
    +---+---+---+---+
    | 1 | 2 | 3 | 4 |
    +---+---+---+---+
    
  14. ==============================

    14.

    select (level - 1) * row_dif + 1 as a, (level - 1) * row_dif + 2 as b, (level - 1) * row_dif + 3 as c
        from dual 
        connect by level <= number_of_rows;
    

    그런 일

    select (level - 1) * 3 + 1 as a, (level - 1) * 3 + 2 as b, (level - 1) * 3 + 3 as c
        from dual 
        connect by level <= 3;
    
  15. from https://stackoverflow.com/questions/2201170/how-to-select-multiple-rows-filled-with-constants by cc-by-sa and MIT license