w_pingfan 2009-07-15 17:58
浏览 257
已采纳

请求解答一条SQL查询的结果-sybase

在测试中,发现执行一条SQL返回的结果不对,具体如下,请各位帮忙解答我的困惑 :?
用的数据库是ASE Enterprise Edition 12.5.4 for Windows:
表结构:
[code="sql"]
CREATE TABLE dbo.AlarmFilter
(
fdiId numeric(10,0) IDENTITY,
fdiTaskId numeric(10,0) NOT NULL,
fdiGroupId numeric(10,0) NOT NULL,
fdiActive int DEFAULT 1 NOT NULL,
CONSTRAINT PK_AlarmFilter
PRIMARY KEY NONCLUSTERED (fdiId)
)
LOCK DATAROWS
WITH EXP_ROW_SIZE=1,
IDENTITY_GAP=1
go
[/code]
数据:
[code="java"]
fdiId fdiTaskId fdiGroupId fdiActive
25 15000977 1 1
26 15000978 1 1
27 15000980 1 1
28 15000979 1 1
29 15000977 1 1
30 15000978 1 1
31 15000979 1 1
32 15000980 1 1
33 15000981 1 1
10 15000977 2 1
11 15000978 2 1
12 15000979 2 1
13 15000980 2 1
14 15000981 2 1
15 15000982 2 1
16 15000987 2 1
17 15000988 2 1
18 15000994 2 1
19 15000995 2 1
20 15000996 2 1
21 15000998 2 1
22 15001000 2 1
23 15000992 2 1
24 15000993 2 1
34 15000982 1 1
35 15000985 1 1
36 15000987 1 1
37 15000988 1 1
38 15000992 1 1
39 15000993 1 1
40 15000994 1 1
41 15000995 1 1
42 15000996 1 1
43 15000998 1 1
44 15001000 1 1
45 15001003 1 1
46 15001021 1 1
47 15000977 3 1
48 15001038 3 1
49 15001038 4 1
50 15001040 4 1
51 15001041 4 1
52 15001042 4 1
53 15001044 4 1
54 15001045 4 1
55 15001046 4 1
56 15001034 4 1
57 15001035 4 1
58 15001036 4 1
59 15001053 2 1
60 15001076 2 1
61 15001049 4 1
62 15001050 4 1
63 15001051 4 1
64 15001053 4 1
65 15001054 4 1
66 15001055 4 1
67 15001056 4 1
68 15001057 4 1
69 15001060 4 1
70 15001069 4 1
71 15001070 4 1
72 15001071 4 1
73 15001072 4 1
74 15001076 4 1
75 15001077 4 1
76 15001080 4 1
77 15001081 4 1
78 15001082 4 1
79 15001083 4 1
80 15001084 4 1
81 15001085 4 1
82 15001086 4 1
83 15001087 4 1
84 15001088 4 1
85 15001089 4 1
86 15001090 4 1
87 15001091 4 1
88 15001092 4 1
89 15001093 4 1
90 15001094 4 1
91 15001096 4 1
92 15001097 4 1
93 15001098 4 1
94 15001102 4 1
95 15001103 4 1
96 15001095 4 1
97 15001099 4 1
98 15001100 4 1
99 15001104 4 1
100 15001105 4 1
101 15001106 4 1
102 15001107 4 1
103 15001108 4 1
104 15001109 4 1
105 15001110 4 1
106 15001111 4 1
107 15001112 4 1
108 15001113 4 1
109 15001114 4 1
110 15001115 4 1
111 15001116 4 1
112 15001117 4 1
113 15001118 4 1
114 15001119 4 1
115 15001120 4 1
116 15001121 4 1
117 15001122 4 1
118 15001123 4 1
119 15001124 4 1
120 15001125 4 1
121 15001126 4 1
122 15001127 4 1
123 15001128 4 1
124 15001129 4 1
125 15001130 4 1
126 15001131 4 1
127 15001132 4 1
128 15001150 4 1
129 15001133 4 1
130 15001134 4 1
131 15001135 4 1
132 15001136 4 1
133 15001151 4 1
134 15001152 4 1
135 15001153 4 1
136 15001154 4 1
137 15001155 4 1
138 15001137 4 1
139 15001156 4 1
140 15001157 4 1
141 15001158 4 1
142 15001159 4 1
143 15001160 4 1
144 15001161 4 1
145 15001162 4 1
146 15001163 4 1
147 15001138 4 1
148 15001139 4 1
149 15001164 4 1
150 15001165 4 1
151 15001166 4 1
152 15001167 4 1
153 15001168 4 1
154 15001169 4 1
155 15001170 4 1
156 15001140 4 1
157 15001179 4 1
158 15001180 4 1
159 15001181 4 1
160 15001182 4 1
161 15001141 4 1
162 15001142 4 1
163 15001143 4 1
164 15001144 4 1
165 15001145 4 1
166 15001146 4 1
167 15001147 4 1
168 15001148 4 1
169 15001149 4 1
170 15001171 4 1
171 15001172 4 1
172 15001173 4 1
173 15001174 4 1
174 15001175 4 1
175 15001176 4 1
176 15001177 4 1
177 15001178 4 1
[/code]
执行的SQL:
[code="sql"]
select max(fdiId) from (
SELECT top 3 * from (
SELECT T.fdiId,
T.fdiTaskId,
T.fdiGroupId,
T.fdiActive
FROM dbo.AlarmFilter T
) tbl_1
) tbl_2
[/code]
执行结果:
[code="java"]177[/code]

[color=red]我的问题是:查询期望是返回27的,但事实上查询返回的是177。[/color]
我是这样分析的:
子查询[code="sql"]
SELECT top 3 * from (
SELECT T.fdiId,
T.fdiTaskId,
T.fdiGroupId,
T.fdiActive
FROM dbo.AlarmFilter T
) tbl_1
[/code]
返回的结果是
[code="java"]
fdiId fdiTaskId fdiGroupId fdiActive
25 15000977 1 1
26 15000978 1 1
27 15000980 1 1
[/code]

然后我在外面加一层select max(fdiId) 应该是返回最大的fdiId 27,但事实上返回的却是177(整个表最大的fdiId),
我把上面的子查询建一个视图,然后select max(fdiId) from testview,返回的还是177,
我把max改为min,返回的是10(整个表最小的fdiId)
唉,我想不明白。。。哪位帮我解答一下,难道Sybase有不支持这样的查询?

[b]问题补充:[/b]
[quote]Sql代码

  1. SELECT top 3 * from (
  2. SELECT T.fdiId,
  3. T.fdiTaskId,
  4. T.fdiGroupId,
  5. T.fdiActive
  6. FROM dbo.AlarmFilter T
  7. ) tbl_1

SELECT top 3 * from (

SELECT T.fdiId,

T.fdiTaskId,

T.fdiGroupId,

T.fdiActive

FROM dbo.AlarmFilter T

) tbl_1

返回的结果不确定把,你必须排序了才能是你期望的。[/quote]

查询返回的结果没变啊,因为子查询返回的数据定了,外加Select应该是定的吧?
还有一点就是子查询不能用order by,所以。。
[b]问题补充:[/b]
[quote]select max(tbl_2.fdiId) from (
SELECT top 3 * from (
SELECT T.fdiId,
T.fdiTaskId,
T.fdiGroupId,
T.fdiActive
FROM dbo.AlarmFilter T
) tbl_1
) tbl_2 [/quote]

这个查询返回的结果不变还是177。

[quote]
没有用过 sybase 怀疑是这里有问题
Sql代码

  1. top 3 * [/quote] 可能真是这个top 3 * 在子查询中不起作用的原因,但它不报错啊,晕啊。。 ---------------------------------------- [quote] 你完全可以不用子查询啊,不知道sybase里面有没有类似oracle里面rownum的东西,这里不排序肯定是不行的啊,还有就是这里的top 3不能放在子查询里面?[/quote] sybase中没有这样的东西,现在觉得sybase真差。 [b]问题补充:[/b] [color=red]刚刚在MS SQLServer2005 上测试了一下,结果和Sybase一样,那应该不是Sybase的问题,这个SQL语法没错啊,哪位知道是怎么解析执行的吗?[/color]
  • 写回答

6条回答 默认 最新

  • icefishc 2009-07-17 03:41
    关注

    top 不能这么用。  top加在里面(子查询) 和外面的效果是一样的. 
    不要用top了 想别的办法吧。 
    由于不知道你的具体需求 不好帮你写。 

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试