下面这条SQL语句表名和列名违反相应的规则吗
SELECT*FROMtb_infoinfoWHERE(info.info_type=2)AND(info.info_state='1')AND(info.info_pa...
SELECT * FROM tb_info info WHERE (info.info_type = 2) AND (info.info_state = '1') AND (info.info_payfor = '0') and (info.ROWNUM<=3) AND (info.info_date < (SELECT MIN(info_date) FROM (SELECT info_date FROM tb_info WHERE (info_type = info.info_type) AND (info_state = '1') AND (info_payfor = '0') and (ROWNUM<=3) ORDER BY info_date DESC) mindate)) ORDER BY info.info_date DESC
这条SQL语句,系统一直报“无效的用户.表.列,表.列,或列规格”异常,都要崩溃了,求求各位高手帮我看一下,指教指教,谢了!!!我是新注册的,所以,没有悬赏分,恳求各位高手一定要帮帮我呀,我将万分感激!!! 展开
这条SQL语句,系统一直报“无效的用户.表.列,表.列,或列规格”异常,都要崩溃了,求求各位高手帮我看一下,指教指教,谢了!!!我是新注册的,所以,没有悬赏分,恳求各位高手一定要帮帮我呀,我将万分感激!!! 展开
3个回答
展开全部
一楼的意思是对的,不过是没有表达清楚吧
在嵌套查询的子查询里面确实不能含有ORDER BY子句的
ORDER BY子句一定在最外层的最后面
2楼的~你没有看题哦~1楼说的没错的,表达错误~
-------------------9-8 10:18,先对【wyehua】说抱歉,字打上去就知道错了,但是一直在查资料,调试,上班,所以没来得及更新,现在把完整的回答贴上来。
1,单独的条件语句建议不要加括号,要不复杂查询,而且含很多嵌套语句的话,看着会很晕的,你看看我这样写是不是看起来要舒服很多。
2,info.ROWNUM这种写法是错误的,会报“无效的用户.表.列,表.列,或列规格”错误,rownum并不属于info表的列,他只存在于内存中。不同的嵌套中rownum不用加表.rownum标识符,以下查询测试可行select * from tt where ROWNUM <5 and id in (select a.id from tt a where rownum <4) order by id;好像相同的rownum列并没有冲突,个人理解为rownum是在每次子查询或者嵌套查询中都会生成的,在读取完后就销毁了,也就是说任何一个时间内存中都只存在一个rownum列。当然我上面的查询不排除是特殊情况。各位可以都测试下。测试出真知哈。查资料得知oracle中明确规定【rownum不能以任何基表的名称作为前缀】,另外理解rownum的话,rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数。例如下面两种用可以用rownum的变通方式实现分页:
select * from (select rownum row_num,month,sell
from (select month,sell from sale group by month,sell))
where row_num between 5 and 9;【网友评论】
select dmp.row_num,dmp.REQUIREMENT_ID from (select rownum as row_num, REQUIREMENT_ID from (select REQUIREMENT_ID from requirement order by REQUIREMENT_ID desc)) dmp where row_num between 10 and 20;【网友评论】
3,【ORDER BY子句一定只能放最外层查询的最后,不能放在子查询中,要不会在order by附近报缺少右括号的错误,显然系统把order by默认为最外层了。】这个我很抱歉,描述有误,应该是ORDER BY子句只能放在FROM子查询子句里,或者最外层的最后,形如select score from money t where exists (select min(t2.score) from money t2 where t.cid = t2.score order by score);ORDER BY子句放在条件子查询里面是要出错的,而且是没有意义的=。=
4,你的查询的修改问题。光成你写的这个子查询的写的意思来看的话,SELECT min(info_date) FROM (SELECT info_date FROM tb_info WHERE info_type = info.info_type AND info_state = '1' AND info_payfor = '0' and ROWNUM<=3 ORDER BY info_date DESC) mindate,你的意思是不是要将查询(SELECT info_date FROM tb_info WHERE info_type = info.info_type AND info_state = '1' AND info_payfor = '0' and ROWNUM<=3 ORDER BY info_date DESC)按照info_date降序排列,然后取前3条,也就是说取查询里的最大的前三条,然后再SELECT min(info_date) FROM这个查询,那么意思就是查找这个查询里的第三大的info_date是吧。我先只是按你写的查询来理解你想要的效果,这个可以用不含ORDER BY子句实现,转到4.2.但是and ROWNUM<=3 ORDER BY info_date DESC这个条件有别的问题。看下列测试语句就知道了,转4.1.
4.1 and ROWNUM<=3 ORDER BY info_date DESC得不到你想要的结果,查询SELECT min(info_date) FROM (SELECT info_date FROM tb_info WHERE info_type = info.info_type AND info_state = '1' AND info_payfor = '0' and ROWNUM<=3 ORDER BY info_date DESC) mindate应该改为这样子:
SELECT min(info_date) FROM (SELECT info_date FROM tb_info WHERE info_type = info.info_type AND info_state = '1' AND info_payfor = '0' ORDER BY info_date DESC) where ROWNUM < =3;
4.2 那么你的查询语句应该改为这样子SELECT * FROM (select * from tb_info info WHERE info.info_type = 2 AND info.info_state = '1' AND info.info_payfor = '0' AND info.info_date < (SELECT min(info_date) FROM (SELECT info_date FROM tb_info WHERE info_type = info.info_type AND info_state = '1' AND info_payfor = '0' ORDER BY info_date DESC) where ROWNUM < =3) ORDER BY info.info_date DESC) where ROWNUM <=3;
补rownum的概念:
其实, 理解rownum的关键是Oracle 如何执行查询语句. 如果先执行笛卡尔集运算,再执行where条件限制,那么rownum就可以实现 rownum> n(n>=1)的功能. 但oralce是边执行笛卡尔集运算,边应用选择条件,所以rownum>n(n>1=)永远不成立;【网友评论】
但如果就是想要用 rownum > 10 这种条件的话话就要用嵌套语句,把 rownum 先生成,然后对他进行查询。
select * from (selet rownum as rn,t1.* from a where ...) where rn >10一般代码中对结果集进行分页就是这么干的。【网友评论】
在嵌套查询的子查询里面确实不能含有ORDER BY子句的
ORDER BY子句一定在最外层的最后面
2楼的~你没有看题哦~1楼说的没错的,表达错误~
-------------------9-8 10:18,先对【wyehua】说抱歉,字打上去就知道错了,但是一直在查资料,调试,上班,所以没来得及更新,现在把完整的回答贴上来。
1,单独的条件语句建议不要加括号,要不复杂查询,而且含很多嵌套语句的话,看着会很晕的,你看看我这样写是不是看起来要舒服很多。
2,info.ROWNUM这种写法是错误的,会报“无效的用户.表.列,表.列,或列规格”错误,rownum并不属于info表的列,他只存在于内存中。不同的嵌套中rownum不用加表.rownum标识符,以下查询测试可行select * from tt where ROWNUM <5 and id in (select a.id from tt a where rownum <4) order by id;好像相同的rownum列并没有冲突,个人理解为rownum是在每次子查询或者嵌套查询中都会生成的,在读取完后就销毁了,也就是说任何一个时间内存中都只存在一个rownum列。当然我上面的查询不排除是特殊情况。各位可以都测试下。测试出真知哈。查资料得知oracle中明确规定【rownum不能以任何基表的名称作为前缀】,另外理解rownum的话,rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数。例如下面两种用可以用rownum的变通方式实现分页:
select * from (select rownum row_num,month,sell
from (select month,sell from sale group by month,sell))
where row_num between 5 and 9;【网友评论】
select dmp.row_num,dmp.REQUIREMENT_ID from (select rownum as row_num, REQUIREMENT_ID from (select REQUIREMENT_ID from requirement order by REQUIREMENT_ID desc)) dmp where row_num between 10 and 20;【网友评论】
3,【ORDER BY子句一定只能放最外层查询的最后,不能放在子查询中,要不会在order by附近报缺少右括号的错误,显然系统把order by默认为最外层了。】这个我很抱歉,描述有误,应该是ORDER BY子句只能放在FROM子查询子句里,或者最外层的最后,形如select score from money t where exists (select min(t2.score) from money t2 where t.cid = t2.score order by score);ORDER BY子句放在条件子查询里面是要出错的,而且是没有意义的=。=
4,你的查询的修改问题。光成你写的这个子查询的写的意思来看的话,SELECT min(info_date) FROM (SELECT info_date FROM tb_info WHERE info_type = info.info_type AND info_state = '1' AND info_payfor = '0' and ROWNUM<=3 ORDER BY info_date DESC) mindate,你的意思是不是要将查询(SELECT info_date FROM tb_info WHERE info_type = info.info_type AND info_state = '1' AND info_payfor = '0' and ROWNUM<=3 ORDER BY info_date DESC)按照info_date降序排列,然后取前3条,也就是说取查询里的最大的前三条,然后再SELECT min(info_date) FROM这个查询,那么意思就是查找这个查询里的第三大的info_date是吧。我先只是按你写的查询来理解你想要的效果,这个可以用不含ORDER BY子句实现,转到4.2.但是and ROWNUM<=3 ORDER BY info_date DESC这个条件有别的问题。看下列测试语句就知道了,转4.1.
4.1 and ROWNUM<=3 ORDER BY info_date DESC得不到你想要的结果,查询SELECT min(info_date) FROM (SELECT info_date FROM tb_info WHERE info_type = info.info_type AND info_state = '1' AND info_payfor = '0' and ROWNUM<=3 ORDER BY info_date DESC) mindate应该改为这样子:
SELECT min(info_date) FROM (SELECT info_date FROM tb_info WHERE info_type = info.info_type AND info_state = '1' AND info_payfor = '0' ORDER BY info_date DESC) where ROWNUM < =3;
4.2 那么你的查询语句应该改为这样子SELECT * FROM (select * from tb_info info WHERE info.info_type = 2 AND info.info_state = '1' AND info.info_payfor = '0' AND info.info_date < (SELECT min(info_date) FROM (SELECT info_date FROM tb_info WHERE info_type = info.info_type AND info_state = '1' AND info_payfor = '0' ORDER BY info_date DESC) where ROWNUM < =3) ORDER BY info.info_date DESC) where ROWNUM <=3;
补rownum的概念:
其实, 理解rownum的关键是Oracle 如何执行查询语句. 如果先执行笛卡尔集运算,再执行where条件限制,那么rownum就可以实现 rownum> n(n>=1)的功能. 但oralce是边执行笛卡尔集运算,边应用选择条件,所以rownum>n(n>1=)永远不成立;【网友评论】
但如果就是想要用 rownum > 10 这种条件的话话就要用嵌套语句,把 rownum 先生成,然后对他进行查询。
select * from (selet rownum as rn,t1.* from a where ...) where rn >10一般代码中对结果集进行分页就是这么干的。【网友评论】
展开全部
FROM (SELECT info_date FROM tb_info WHERE (info_type = info.info_type) AND (info_state = '1') AND (info_payfor = '0') and (ROWNUM<=3) ORDER BY info_date DESC) mindate))
from 里面不能加 ORDER BY 跟view一样
from 里面不能加 ORDER BY 跟view一样
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你要看一下它报的无效的"表.列"中的"表"中是否有"表.列"这个字段?
hovlj_1130: 你自己试一下,哪个嵌套语句中不能用order by了?
PS:SQL SERVER中是不允许,人家这个可是ORACLE的! 没见着Oracle中的伪列rownum吗?还是自己好好看看吧~
hovlj_1130: 你自己试一下,哪个嵌套语句中不能用order by了?
PS:SQL SERVER中是不允许,人家这个可是ORACLE的! 没见着Oracle中的伪列rownum吗?还是自己好好看看吧~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询