2011-02-16 11 views
1

마지막으로 반환 된 행의 필드에 특정 값이있는 행을 반환하는 SQL 쿼리를 작성하는 데 문제가 있습니다 (이 수정은 반환 된 결과에만 적용되며 데이터베이스 레코드는 수정하지 않아야합니다) .SQL 쿼리에서 반환 된 마지막 행의 값을 변경하는 방법은 무엇입니까?

SELECT A.a, 
     A.b, 
     A.c 
    FROM A 
WHERE A.b = 10 

결과가 반환 : 나는 자동적으로, 마지막 행의 행 필드에 특정 값을 넣어 요청을하고 싶은

A.a |A.b |A.c 
-------------- 
1 10 zaza 
2 10 zozo 
3 10 zuzu 
4 10 zozo 

: 여기

은 예입니다

A.a |A.b |A.c 
-------------- 
1 10 zaza 
2 10 zozo 
3 10 zuzu 
4 10 XXXX 
+0

오라클의 버전은 무엇입니까? 중복성은 무엇입니까? 최대 값이 동일한 관계는 무엇입니까? –

답변

2

은 다음의을 대체 할 것이다 (?이 가능한 경우)

+0

다른 옵션 :'row_number() over desc (order by desc) = 1'. 또한 검색된 CASE는 다음 중 하나 인 경우'case row_number() over (desc by order by desc) '로 간단하게 바꿀 수 있습니다. –

+0

고마워. 귀하의 솔루션을 실제 (그리고 "좀 더 복잡한") 요청에 적용했는데 잘 작동합니다! – Clem

0

먼저 ORDER BY 문이 필요합니다. 오라클은 행들이 입력 된 순서대로 반환됩니다 보장하지 않습니다, 그래서 당신은 당신의 SQL을 변경해야합니다 : 어떤 의미를 가지고있는 "마지막"행의 개념에 대한

select A.a, A.b, A.c 
From A 
Where A.b = 10 
ORDER BY A.a; 

.

여기에 한 가지 방법입니다 ... 잘 것보다 일을 더 나은 방법이있을 수있다 ...

SELECT A, B, C 
FROM (
SELECT A.A, A.B, A.C 
FROM A 
WHERE A.A <> (SELECT MAX(A.A) FROM A WHERE A.B = 10) 
AND A.B = 10 
UNION ALL 
SELECT A.A, A.B, 'whatever' 
FROM A 
WHERE A.A = (SELECT MAX(A.A) FROM A WHERE A.B = 10) 
AND A.B = 10 
) 
ORDER BY A.A 

당신은 AA가를 어디에 두 행이있을 경우의 동작은해야 무슨 말을하지 않습니다 행의 순서는 열 a 결정되면

SELECT A, 
     B, 
     CASE 
     WHEN A = (SELECT MAX(A) FROM TEST WHERE B = 10) THEN 'XXXX' 
     ELSE C 
     END C 
FROM TEST 
+0

사실, 같은 값을 가진 2 개의 행을 가질 수 있으며 질문의 요구 사항을 변경하지 않습니다. 유일하고 중요한 조건은 마지막으로 반환 된 행을 변경하려는 것입니다. 감사! – Clem

0

덜 성가신 약간 동일한- "마지막"행의 값.

select a 
     ,b 
     ,case when row_number() over(order by a) = count(*) over() then 'XXX' 
                   else c end as c 
    from v 
order by a; 
관련 문제