2016-09-07 1 views
0

아래의 쿼리가 있습니다. 편집 날짜가 null이 아닌 경우 최신 레코드를 반환해야하며 임의로 지정해야합니다. 그렇지 않으면 레코드를 임의 화해야합니다 . 나는 아래의 순서를 시도했지만 누락 된 키워드 오류가 발생했습니다. 난 당신이 수정 얻는 경우에ORA-00905 : Case를 순서대로 사용하는 경우 누락 된 키워드

SELECT * FROM (SELECT c.id,c.edit_date, c.name,l.title 
              FROM tableA c, tableb l 
             WHERE c.id = l.id 
              AND c.published_ind = 'Y' 
              AND lc.type_id != 4 
              AND TRIM(c.img_file) IS NOT NULL 
             ORDER BY DBMS_RANDOM.VALUE 
            ) 
         WHERE ROWNUM = 1 

    order by case when c.edit_date = 'null' 
      then DBMS_RANDOM.VALUE 
      else DBMS_RANDOM.VALUE, c.edit_date desc 
    end 
+1

사례 식은 하나의 값을 반환합니다. 코드의 조건부 실행에는 사용되지 않습니다. – jarlh

+0

@jarlh - 어디에서나 "조건부 실행"이 보이지 않습니다. 단지'order by' 절에 사용 된'case' 표현식을 보았습니다. 그것은 유효한 사용법입니다. – mathguy

+0

@mathguy, \t OP와 마찬가지로 보이지만 DBMS_RANDOM.VALUE (c.edit_date = 'null'인 경우)로 정렬하거나 DBMS_RANDOM.VALUE, c.edit_date desc로 정렬하려고합니다. 나는. 한 가지로든 다른 것으로든 어떤 종류의 조건부 실행. – jarlh

답변

1

, 당신은 가장 높은 날짜 (동일한 날짜에 더 기록이있는 경우 임의의 하나) 중 하나에 ID 당 레코드를 얻으려고하거나 NULL 날짜가 (다시 임의 일 경우 더 같은 ID를 가진 NULL 기록은 존재한다.

그래서이 데이터
 ID EDIT_DATE   TEXT 
---------- ------------------- ---- 
     1 01.01.2015 00:00:00 A  
     1 01.01.2016 00:00:00 B  
     1 01.01.2016 00:00:00 C  
     2 01.01.2015 00:00:00 D  
     2 01.01.2016 00:00:00 E  
     2      F  
     2      G 

당신이 기대하는 가정 중 B 또는 ID = 1 C 및 ID = 2

할이 쿼리에 대한 F 또는 G 중 그것. 모든 선행 열이 같은 경우 임의의 결과를 얻을 수 ...

with dta as (
select 1 id, to_date('01012015','ddmmyyyy') edit_date, 'A' text from dual union all 
select 1 id, to_date('01012016','ddmmyyyy') edit_date, 'B' text from dual union all 
select 1 id, to_date('01012016','ddmmyyyy') edit_date, 'C' text from dual union all 
select 2 id, to_date('01012015','ddmmyyyy') edit_date, 'D' text from dual union all 
select 2 id, to_date('01012016','ddmmyyyy') edit_date, 'E' text from dual union all 
select 2 id, NULL edit_date, 'F' text from dual union all 
select 2 id, NULL edit_date, 'G' text from dual), 
dta2 as (
select ID, EDIT_DATE, TEXT, 
row_number() over (partition by ID order by edit_date DESC NULLS first, DBMS_RANDOM.VALUE) as rn 
from dta) 
select * 
from dta2 where rn = 1 
order by id 
; 

     ID EDIT_DATE   TEXT   RN 
---------- ------------------- ---- ---------- 
     1 01.01.2016 00:00:00 B    1 
     2      F    1 

희망 당신은 할 수 재사용 - 사용 기능은 마지막 순서 열 같은 임의의 값을 추가 FIRST NULLS와 순서입니다 당신이 조금 다른 결과가 필요하다면 아이디어. ...

+0

귀하의 의견을 주셔서 감사합니다, 난 아직도이 하나 알아낼려고, 어떤 아이디어를 부탁드립니다. 그래서, 각 ID는 오직 하나의 레코드를 가질 것입니다. 만약 edit_dt가 null이 아니면, 그 레코드를 무작위로 얻고 싶습니다. 결과 집합에서 단 1 행만 필요하므로 무작위 추출이 필요합니다. 원래 쿼리가 수행하는 작업입니다. 이제 편집 날짜를 질의에 입력하고이를 수행해야합니다. 가장 최근에 업데이트 된 내용과 가장 최근의 레코드를 먼저 로테이션에서 검색해야합니다. 감사합니다. – user747291

+0

@ user747291 여러 번 의견을 다시 읽었지만 실제로는 확실하지 않습니다. 만약 내가 그것을 understod. 샘플 데이터에 예상 결과를 제공 할 수 있습니다 (결과가 무작위성을 보여줄 수 있음). –

0

성명 WHERE 항상 진술 ORDER BY 전에 적용됩니다. 따라서 처음에는 쿼리에서 WHERE ROWNUM = 1이 적용되고 그 이후에만 단일 레코드로 order by case이 적용됩니다. 아마도 처음에 ORDER BY을 실행하고 적절한 순서로 행 집합을 가져온 다음 하위 행을 선택하기 위해 WHERE ROWNUM = 1을 실행하는 또 다른 하위 쿼리를 추가해야합니다.

Statment ORDER BY ... DBMS_RANDOM.VALUE, c.edit_date 이상하게 보입니다. 실제로 레코드 세트는 DBMS_RANDOM.VALUE으로 정렬되고 행 집합에 행 수가 2 개있는 경우 DBMS_RANDOM.VALUE이되며 추가적으로 c.edit_date으로 정렬합니다.