首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

这个sql语句该如何写?

2013-01-19 
这个sql语句该怎么写?!!!有这样一个表TABLE就是要取出ABCDE这5列 A B C D 组合起来肯定是惟一的但是 ABC相

这个sql语句该怎么写?!!!
有这样一个表TABLE
就是要取出ABCDE这5列 
A B C D 组合起来肯定是惟一的
但是 ABC相同情况下 只需要取出最大D的这一行数据就好(筛选条件应该跟E无关)
例如:

对于 ABCED
 (注意E是排在D前面的)

----------------------
|   A    |    B   |   C    |   E    |    D  |       |       |


----------------------
|   11    |   22    |    33   |    A   |    0   |       |       |
----------------------
|   11    |   22    |    33   |    B   |    2   |       |       |
----------------------
|   11    |   22    |    33   |    C   |    1   |       |       |
----------------------
只需要取出
|   11    |   22    |    33   |    B   |    2   |       |       |

就好。。。



再例如
对于下面这个

----------------------
|   A    |    B   |   C    |   E    |    D  |       |       |

----------------------
|   11    |   22    |    33   |    A   |    0   |       |       |
----------------------
|   11    |   22    |    33   |    B   |    2   |       |       |
----------------------
|   11    |   22    |    33   |    C   |    1   |       |       |
----------------------


|   22    |   22    |    33   |    D   |    0   |       |       |


----------------------
|   22    |   22    |    33   |    B   |    1   |       |       |
----------------------

|   33    |   22    |    33   |    C   |    2   |       |       |
----------------------
|   33    |   22    |    33   |    A   |    3   |       |       |
----------------------


|   44    |   22    |    33   |    K   |    0   |       |       |
----------------------
|   44    |   22    |    33   |    A   |    1   |       |       |
----------------------


|   55    |   22    |    33   |    Z   |    1   |       |       |
----------------------


需要取出
|   11    |   22    |    33   |    B   |    2   |       |       |
----------------------
|   22    |   22    |    33   |    B   |    1   |       |       |
----------------------
|   33    |   22    |    33   |    A   |    3   |       |       |
----------------------
|   44    |   22    |    33   |    A   |    1   |       |       |
----------------------
|   55    |   22    |    33   |    Z   |    1   |       |       |


----------------------


现在有用这个max(rowid)方法
但是max(rowid)好像是跟列的排序有关的
如果在table定义的时候,D列排在E列前面的话
就能正确地取出结果
但是E列排在D列前面的话
 max(rowid)是会根据E的大小来选择哪一行数据

select * from Table where rowid in (select max(rowid) from Table group by A || B || C);



请帮忙写下这个SQL语句
(不管table定义的时候列的顺序)
运行ok的话马上结贴给分!
多谢!!! sql
[解决办法]

select w.A, w.B, w.C, w.E, w.D
  from test2 w, (select A, B, C, max(D) as F from test2 group by A, B, C) t
 where w.A = t.A
   and w.B = t.B
   and w.C = t.C
   and D = t.F
 order by w.A, w.B, w.C

[解决办法]
测试脚本(没有用with):

CREATE TABLE foo(
    a VARCHAR2(20),
    b VARCHAR2(20),
    c VARCHAR2(20),
    d VARCHAR2(20),
    e VARCHAR2(20)
);
INSERT INTO foo VALUES ('11','22','33','A','0');
INSERT INTO foo VALUES ('11','22','33','B','2');
INSERT INTO foo VALUES ('11','22','33','C','1');
INSERT INTO FOO VALUES ('11','22','33','A','0');
INSERT INTO FOO VALUES ('11','22','33','B','2');
INSERT INTO FOO VALUES ('11','22','33','C','1');
INSERT INTO FOO VALUES ('22','22','33','D','0');
INSERT INTO FOO VALUES ('22','22','33','B','1');
INSERT INTO FOO VALUES ('33','22','33','C','2');
INSERT INTO FOO VALUES ('33','22','33','A','3');
INSERT INTO FOO VALUES ('44','22','33','K','0');
INSERT INTO FOO VALUES ('44','22','33','A','1');
INSERT INTO FOO VALUES ('55','22','33','Z','1');


查询SQL:

SELECT O.A,O.B,O.C,O.D,O.E FROM 
(SELECT a,b,c,d,e,MAX(e) over(PARTITION BY a,b,c) AS eg FROM foo) o
WHERE o.eg =e;


查询结果:

ABCDE
112233B2
112233B2
222233B1
332233A3
442233A1
552233Z1

热点排行