楼主: ZALBB

[原创] 这个SQL该怎么写?

[复制链接]
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:342010新春纪念徽章
日期:2010-03-01 11:20:51
11#
发表于 2004-12-6 10:22 | 只看该作者
SQL> select id,sum(to_number(substr(subject,3)))-(1+id)*id/2 from classtab group
by id ;

        ID SUM(TO_NUMBER(SUBSTR(SUBJECT,3)))-(1+ID)*ID/2
---------- ---------------------------------------------
         1                                             2
         3                                            -2
         4                                             0

是不是你要的?

使用道具 举报

回复
论坛徽章:
52
SQL数据库编程大师
日期:2011-04-13 12:09:01奥运会纪念徽章:水球
日期:2012-10-08 09:35:51蛋疼蛋
日期:2012-11-19 10:28:53鲜花蛋
日期:2012-12-05 14:37:57紫蛋头
日期:2012-12-11 17:27:27紫蛋头
日期:2012-12-24 23:00:26兰博基尼
日期:2013-11-21 09:19:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14
12#
发表于 2004-12-6 10:31 | 只看该作者

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
13#
 楼主| 发表于 2004-12-6 10:36 | 只看该作者
最初由 pingshx 发布
[B]SQL> select id,sum(to_number(substr(subject,3)))-(1+id)*id/2 from classtab group
by id ;

        ID SUM(TO_NUMBER(SUBSTR(SUBJECT,3)))-(1+ID)*ID/2
---------- ---------------------------------------------
         1                                             2
         3                                            -2
         4                                             0

是不是你要的? [/B]


这种方法是看了数据后在写的,若数据是假设的,
真实数据不是这样,该如何操作?

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:342010新春纪念徽章
日期:2010-03-01 11:20:51
14#
发表于 2004-12-6 10:44 | 只看该作者
最初由 ZALBB 发布
[B]

这种方法是看了数据后在写的,若数据是假设的,
真实数据不是这样,该如何操作? [/B]

不知你说的数据假设是怎么一个假设,数据类型?比如是字符窜序列,那SQL肯定要做相应的变化。不管怎么说,我个人认为,写SQL还是要看数据再定吧!

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
15#
 楼主| 发表于 2004-12-6 11:07 | 只看该作者
最初由 pingshx 发布
[B]
不知你说的数据假设是怎么一个假设,数据类型?比如是字符窜序列,那SQL肯定要做相应的变化。不管怎么说,我个人认为,写SQL还是要看数据再定吧! [/B]


数据类型、长度不变,但数据变了,或者说,不是ID=1的情况,
而是应用时指定的任意一值。

刚才我尝试过,把 'A02' 改为 'A03',删除掉ID=4中多出的一条,
结果就不适用你的方法。

或者这么说,若SQL语句里用不上已知条件(ID=1),
或者根据SUBJECT的值来制定SQL语句的话,都不符合要求。

使用道具 举报

回复
论坛徽章:
52
SQL数据库编程大师
日期:2011-04-13 12:09:01奥运会纪念徽章:水球
日期:2012-10-08 09:35:51蛋疼蛋
日期:2012-11-19 10:28:53鲜花蛋
日期:2012-12-05 14:37:57紫蛋头
日期:2012-12-11 17:27:27紫蛋头
日期:2012-12-24 23:00:26兰博基尼
日期:2013-11-21 09:19:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14
16#
发表于 2004-12-6 11:43 | 只看该作者
[PHP]
select distinct id from CLASSTAB o where not  exists(
(
select subject from CLASSTAB where id=1
)
minus
(
select subject from CLASSTAB where id=o.id
)
)
;
[/PHP]

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
17#
 楼主| 发表于 2004-12-6 12:01 | 只看该作者
最初由 accelerator 发布
[B][PHP]
select distinct id from CLASSTAB o where not  exists(
(
select subject from CLASSTAB where id=1
)
minus
(
select subject from CLASSTAB where id=o.id
)
)
;
[/PHP] [/B]


对!?

使用道具 举报

回复
论坛徽章:
52
SQL数据库编程大师
日期:2011-04-13 12:09:01奥运会纪念徽章:水球
日期:2012-10-08 09:35:51蛋疼蛋
日期:2012-11-19 10:28:53鲜花蛋
日期:2012-12-05 14:37:57紫蛋头
日期:2012-12-11 17:27:27紫蛋头
日期:2012-12-24 23:00:26兰博基尼
日期:2013-11-21 09:19:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14
18#
发表于 2004-12-6 12:38 | 只看该作者
不对!?

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:342010新春纪念徽章
日期:2010-03-01 11:20:51
19#
发表于 2004-12-6 13:22 | 只看该作者
最初由 ZALBB 发布
[B]

数据类型、长度不变,但数据变了,或者说,不是ID=1的情况,
而是应用时指定的任意一值。

刚才我尝试过,把 'A02' 改为 'A03',删除掉ID=4中多出的一条,
结果就不适用你的方法。

或者这么说,若SQL语句里用不上已知条件(ID=1),
或者根据SUBJECT的值来制定SQL语句的话,都不符合要求。 [/B]


我那方法是有问题,比如:
4 A01
4 A02
4 A03
4 A04

4 A01
4 A03
4 A03
4 A03
是等效的,ID相同,有重复记录会有问题。
除非这个重复,而且要使有序,用这个可以:
  1  select id,subject,rn-to_number(substr(subject,3))
  2  from
  3  (
  4  select id,subject,row_number() over(partition by id order by subject) rn
  5   from classtab
  6* )
SQL> /

        ID SUBJECT    RN-TO_NUMBER(SUBSTR(SUBJECT,3))
---------- ---------- -------------------------------
         1 A01                                      0
         1 A02                                      0
         3 A01                                      0
         3 A03                                     -1
         4 A01                                      0
         4 A02                                      0
         4 A03                                      0
         4 A04                                      0
从这里,判断ID里subject里是一个有序,没间断的。
然后再实现你要的,后面写的SQL很烦,我现在还没实现!

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
20#
 楼主| 发表于 2004-12-6 13:42 | 只看该作者
最初由 accelerator 发布
[B]不对!? [/B]


经测试,加上一条件(AND ID 〈〉1) 后就OK了。

请解释你的思维!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表