2011-02-16 16 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 

我想请求自动把一个特定的值中的最后一行的AC场,如:

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

对于哪个版本的Oracle?那么重复项的最大值是多少? – 2011-02-16 18:12:13

回答

2

如果行的顺序是由a柱测定,以下将取代C - “最后”行中的值。

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; 
+0

另一种选择:`row_number()over(按desc排序)= 1`。另外,搜索的CASE可以用一个简单的CASE替换:`1 then then ...`时case'row_number()over(通过desc命令)。 – 2011-02-17 12:38:37

0

首先你需要一个ORDER BY语句。 Oracle不保证行会在他们输入的顺序被退回,所以你需要改变你的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 

你不说的行为应该是什么,如果有2行,其中AA是相同(如果这是可能的?)

+0

实际上,具有相同值的2行是可能的,并且不会改变问题的要求。唯一重要的条件是我想更改最后一个返回的行。谢谢! – Clem 2011-02-18 11:05:49

0

少一点杂乱:

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