比如有一个表结构如下:
Column Name ID Pk Null? Data Type Default Histogram
ROLEID 1 2 N NUMBER (4) No
MODULEID 2 1 N NUMBER (9) No
PRIVRSVD 3 Y VARCHAR2 (10 Byte) No表中的数据如下:
ROLEID MODULEID PRIVRSVD1 3
1 5
1 13
3 5
3 18
3 19
3 67
2 18
2 19
2 20
2 28
2 29
4 36
4 48
6 5
6 6
5 28
10 91
12 8
12 64
12 66
12 18
4 35
12 7
12 20 我想选出这样的结果
1 3
2 18
3 5
4 36
6 5
10 91
12 7
不知道怎么写啊?
还有我希望在查询的过程中能够观察子查询的结果有没有办法?看到子查询的结果更有助于别写整个表达式啊?
Column Name ID Pk Null? Data Type Default Histogram
ROLEID 1 2 N NUMBER (4) No
MODULEID 2 1 N NUMBER (9) No
PRIVRSVD 3 Y VARCHAR2 (10 Byte) No表中的数据如下:
ROLEID MODULEID PRIVRSVD1 3
1 5
1 13
3 5
3 18
3 19
3 67
2 18
2 19
2 20
2 28
2 29
4 36
4 48
6 5
6 6
5 28
10 91
12 8
12 64
12 66
12 18
4 35
12 7
12 20 我想选出这样的结果
1 3
2 18
3 5
4 36
6 5
10 91
12 7
不知道怎么写啊?
还有我希望在查询的过程中能够观察子查询的结果有没有办法?看到子查询的结果更有助于别写整个表达式啊?
是取每个ROLEID 的最小MODULEID 吗
select roleid,min(moduleid) from tablename group by roleid;要同时显示子查询的结果,那你想要2个结果如何显示?
要比较的话可以分开进行两次查询(总的查询和只运行子查询),来比较结果
/* Formatted on 2009-11-18 下午 04:10:09 (QP5 v5.115.810.9015) */
SELECT a.*
FROM MNGROLEPRIVILTB a
WHERE not EXISTS (SELECT roleid
FROM MNGROLEPRIVILTB
WHERE a.roleid > roleid AND a.moduleid = moduleid)
ORDER BY a.roleid但查询结果和我预期的大不相同,所以我希望能够看到子查询的查询结果,进而找出错误。
这个查询就是要找出给个分组中最小的记录。
这个语句查询的结果是相同moduleid中最小的roleid
好像和你的需求相反
你改成
SELECT a.*
FROM MNGROLEPRIVILTB a
WHERE not EXISTS (SELECT 1
FROM MNGROLEPRIVILTB
WHERE a.moduleid > moduleid AND a.roleid = roleid )
ORDER BY a.roleid
SELECT a.*,
case when not EXISTS (SELECT roleid
FROM MNGROLEPRIVILTB
WHERE a.roleid > roleid AND a.moduleid = moduleid) then 1
else 2 end
FROM MNGROLEPRIVILTB a ORDER BY a.roleid 标为1的就是满足你先前where条件的记录
我的查询结果很怪异: ROLEID MODULEID PRIVRSVD
---------- ---------- ----------
1 3
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
1 15
1 16
1 18
1 19
1 20
1 21
1 22
1 23
1 24
1 25 ROLEID MODULEID PRIVRSVD
---------- ---------- ----------
1 26
1 27
1 28
1 29
1 31
1 32
1 33
1 35
1 36
1 37
1 38
1 39
1 68
1 40
1 41
1 42
1 43
1 44
1 45
1 46
1 47 ROLEID MODULEID PRIVRSVD
---------- ---------- ----------
1 2
1 1
1 90
1 83
1 82
1 81
1 80
1 79
1 78
1 77
1 76
1 75
1 74
1 73
1 72
1 71
1 70
1 48
1 50
1 51
1 52 ROLEID MODULEID PRIVRSVD
---------- ---------- ----------
1 53
1 54
1 55
1 56
1 57
1 58
1 59
1 60
1 61
1 62
1 63
1 64
1 65
1 66
1 67
10 91 79 rows selected.
我在5楼说过了,你可以参照改一下
你理解一下那个语句就知道了
not EXISTS (SELECT 1
FROM MNGROLEPRIVILTB
WHERE a.moduleid > moduleid AND a.roleid = roleid )
验证记录的存在性:MNGROLEPRIVILTB 表和a表roleid 相同,且moduleid小于a表中moduleid时,是否存在这么一个记录
如果不存在,返回这条记录