2014-04-03 1 views
7

하드 코딩 된 값 목록에 대한 CTE를 작성하는 방법이 있습니까? 예를 들어, 알려진 ID (예 : 101102105200 ...)의 목록이 있는데 ID라는 하나의 열이있는 CTE를 만들 수 있지만 모든 ID 값은 검색어에 하드 코딩되어 있습니까? BTW, Oracle에서이 쿼리를 실행해야합니다. 감사!정의 된 값 목록을 CTE에 작성하십시오.

답변

10

당신은

WITH cte AS (
    SELECT 101 id FROM dual UNION ALL 
    SELECT 102 FROM dual UNION ALL 
    SELECT 105 FROM dual UNION ALL 
    SELECT 200 FROM dual UNION ALL 
    ... 
) 

은 당신이 정말로 수행하려는 작업에 따라 같은 일을 할 수있는,하지만 당신은 컬렉션을 선언하고 쉼표로 구분 된 구문 분석 기능을 사용하거나 사용하지 않고 (즉를 사용할 수 있습니다 문자열)

CREATE TYPE num_tbl 
    AS TABLE OF NUMBER; 

WITH cte AS (
    SELECT column_value 
    FROM TABLE(num_tbl(101, 102, 105, 200)) 
) 
+0

단지 최근 버전을 추가하면 하위 쿼리 인수 절에 대한 열 별칭을 별도로 정의 할 수 있으므로 잠재적으로 쿼리 절을 약간 깔끔하게 유지할 수 있습니다. WITH cte (id) as (SELECT 101 from dual ... http://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF01702 –

7

편집 : 이전에 권고 된 솔루션은 MSSQL에서만 작동합니다. 따라서 Oracle 솔루션을 추가하고 있습니다. 나는 아래에 원래의 대답을 유지하고있다.

임시 테이블을 사용하여 한 가지 더 많은 솔루션을 생각했습니다 (Justin Cave에서 제공 한 솔루션이 여전히 조금 나은 것으로 보이지만). 여기

는 오라클 데이터베이스에 대한 올바른 해결책이 될해야

CREATE GLOBAL TEMPORARY TABLE temp_ids 
    (id INT) 
    ON COMMIT PRESERVE ROWS; 

INSERT INTO ids (id) VALUES (101); 
INSERT INTO ids (id) VALUES (102); 
INSERT INTO ids (id) VALUES (103); 

이처럼 보일 수 있습니다 방법이다. 내가 여기에 비슷한 문제가 건너와 한


아래

원래 대답은 내 솔루션 (댓글에서 언급 한 바와 같이이 오라클 DB에 불구하고 단지 MSSQL 작동하지 않습니다)입니다

WITH cte AS (
    SELECT * FROM (
     VALUES 
      (1, 2, 3, ...), 
      (2, 3, 4, ...) 
     ) AS a (col1, col2, col3, ...) 
    ) 
INSERT INTO ... 

희망 이게 도움이 :)

+1

이 구문은 Oracle에서는 유효하지 않습니다. –

+0

따라서 혼란스러워서 죄송합니다. 정보를 보내 주셔서 감사합니다. 바라기를 이것은 MSSQL에서 동일한 것을 찾는 다른 누군가를 도울 것입니다. – Zax

+0

그래, 나는 이전의 대답을 편집하고 오라클에 대한 올바른 해결책이라고 생각되는 것을 추가했다. – Zax

관련 문제