2012-02-07 3 views
10

테이블에 삽입하려고하는데 한 열에 하나의 SELECT 문을 사용합니다. 아래는 내 쿼리의 그림입니다.ORA-00907 오른쪽 괄호 문제 - 내부 삽입 쿼리 순서로 선택하십시오.

INSERT INTO MY_TBL (MY_COL1, MY_COL2) 
VALUES (
(SELECT DATA FROM FIR_TABL WHERE ID = 1 AND ROWNUM = 1 ORDER BY CREATED_ON DESC), 
1 
); 

ORA-00907 Missing right Parenthesis을 던집니다. 이 경우 ORDER BY을 제거하면 예상대로 작동합니다. 하지만 주문해야합니다. 명확히하십시오.

미리 감사드립니다.

+4

당신이 RDBMS 테이블에 삽입 된 데이터의 순서에 "의존"만약 내가 당신의 데이터 모델에 의문을 제기 것 :

오류를 방지 할 수 있습니다. 삽입 순서는 영향을받지 않아야하며 데이터를 쿼리 할 때 순서를 수행해야합니다. – Ollie

+0

이 문맥에서 '주문'이 당신을 위해 무엇을 할 것이라고 생각합니까? –

+0

예를 들어, 그 선택을위한 여러 행이있을 수 있습니다. 또한 많은 열이 MY_TBL에 있습니다. 내 업데이트를 확인하십시오. – Vaandu

답변

20

현재 답변 모두 같은 쿼리에서 order byrownum를 사용하는 것은 본질적으로 위험하다는 사실을 무시 :

INSERT INTO MY_TBL (MY_COL) 
SELECT DATA FROM FIR_TABL WHERE ID = 1 ORDER BY CREATED_ON DESC 
; 

수정 된 쿼리의 모습. 원하는 데이터를 얻을 수 있다고 보장 할 수는 없습니다. 당신은 당신이 하위 쿼리를 사용해야합니다 정렬 된 쿼리의 첫 번째 행을 원하는 경우 :

insert into my_tbl (col1, col2) 
select data, 'more data' 
    from (select data 
      from fir_tabl 
      where id = 1 
      order by created_on desc) 
where rownum = 1 
     ; 

또한, 당신이 원하는 방법으로 데이터를 주문 rank 같은 기능을 사용할 수 있습니다 당신은이 있었다면하지만 created_on와 동일한 날짜로 rnk = 1의 2 개의 값이됩니다.

insert into my_tbl (col1, col2) 
select data, 'more data' 
    from (select data 
       , rank() over (order by created_on desc) as rnk 
      from fir_tabl 
      where id = 1) 
where rnk = 1 
     ; 
+0

이것은 Oracle 용으로 수정 한 것 같습니다. 여분의 하위 쿼리와 "누락 된 오른쪽 괄호"(괄호가 누락되어 있지는 않지만)를 사용하도록 변환하면 메시지가 사라집니다. 감사! – rogerdpack

+0

동일한 쿼리에서 rownum과 order by를 사용하는 것이 본질적으로 위험하다는 사실에 대한 참고 자료가 있습니까? – jeromerg

+0

나는 Tom Kate가 @jeromerg에 글을 썼을 것이라고 확신하지만, 당신은 첫 번째 원칙에서 그것을 볼 수 있어야한다. 힙 테이블은 저장되고 검색되어 정렬되지 않습니다. ORDER BY 절은 항상 마지막으로 발생할 작업입니다. 따라서 ROWNUM 술어는 정렬되지 않은 집합의 순서보다 먼저 사용됩니다. 먼저 주문해야하며 SQL 문 조작 순서로 인해 순서는 내부 선택 (FETCH N ROWS 구문과 함께 12c까지)에서 발생해야합니다. – Ben

0

VALUES 키워드를 사용할 때는 SELECT을 사용하지 마십시오. 대신를 사용

INSERT INTO MY_TBL (MY_COL1, MY_COL2) 
SELECT DATA, 1 FROM FIR_TABL WHERE ID = 1 AND ROWNUM = 1 ORDER BY CREATED_ON DESC 
; 
0

데이터를 추출 할 때 삽입해야 할 때가 아니라 삽입 할 때 정렬해야한다는 데 동의합니다.

그러나 해결 방법으로 전체 SELECT를 다른 SELECT로 캡슐화하는 INSERT에서 ORDER BY 절을 분리 할 수 ​​있습니다.

INSERT INTO MY_TABLE (
SELECT * FROM (
    SELECT columns 
    FROM table 
    ORDER BY clause 
    ) 
)