楼主: li2

又来问SQL语句的写法了,不用存储过程是否可写?

[复制链接]
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
11#
发表于 2003-7-28 13:02 | 只看该作者
意义不一样,而结果是一样的,这很正常!

结果一样,并不代表他们的意义是一样的啊

使用道具 举报

回复
论坛徽章:
0
12#
发表于 2003-7-28 13:26 | 只看该作者

测试无误

select a.id_1
     , a.id_2
     , a.name
     , decode(count(b.id_1), 0, 'GGSL', 'YXT'||count(b.id_1)) memo
  from da a
     , db b
where a.id_1 = b.id_1(+)
   and a.id_2 = b.id_2(+)
group by a.id_1
        , a.id_2
        , a.name

使用道具 举报

回复
论坛徽章:
0
13#
发表于 2003-7-28 13:54 | 只看该作者

the running result

ID_1                                    ID_2 NAME       MEMO
--------------------------------------- --------------------------------------- ---------- -------------------------------------------
                                      1                                       1 long       YXT2
                                      1                                       2 wang       YXT1
                                      2                                       1 LI2        GGSL

使用道具 举报

回复
论坛徽章:
0
14#
发表于 2003-7-28 14:07 | 只看该作者
最初由 jaunt 发布
[B]这样试试:
select a.id_1, a.id_2, a.name, nvl(t.total, 0)
from a, (select id_1, count(*) as total from b group by id_1) t
where a.id_1 = t.id_1(+); [/B]


将count(*)  改为 count(id_1) 就是你要的结果

使用道具 举报

回复
论坛徽章:
5
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33蓝色妖姬
日期:2006-04-12 22:10:01会员2006贡献徽章
日期:2006-04-17 13:46:34
15#
 楼主| 发表于 2003-7-28 15:37 | 只看该作者
楼上的,JAUNT 给的语句逻辑有点问题。按照我的理解应该写成这样:
  1  SELECT (A.ID_1*100+A.ID_2),A.NAME,NVL(T.TOTAL,0)
  2  FROM A, (SELECT (ID_1*100+ID_2)  XX,COUNT(*) AS TOTAL FROM B GROUP BY (ID_1*100+ID_2)) T
  3* WHERE (A.ID_1*100+A.ID_2) = XX(+)
SQL> /

(A.ID_1*100+A.ID_2) NAME                 NVL(T.TOTAL,0)
------------------- -------------------- --------------
                101 long                             2
                102 wang                             1
                201 LI2                               0
                202 w8                                2

这个结果是正确的

使用道具 举报

回复
论坛徽章:
5
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33蓝色妖姬
日期:2006-04-12 22:10:01会员2006贡献徽章
日期:2006-04-17 13:46:34
16#
 楼主| 发表于 2003-7-28 15:44 | 只看该作者
谁能告诉我下面二个SQL语句的执行结果是不是肯定一致的
1 SELECT (A.ID_1*100+A.ID_2),A.NAME,NVL(T.TOTAL,0)
2 FROM A, (SELECT (ID_1*100+ID_2) XX,COUNT(*) AS TOTAL FROM B GROUP BY (ID_1*100+ID_2)) T
3* WHERE (A.ID_1*100+A.ID_2) = XX(+) ;

第二条:
1 select a.id_1,a.id_2,a.name,count(b.name) from a,b
2 where
3* (a.id_1=b.id_1(+) and a.id_2=b.id_2(+)
group by a.id_1,a.id_2,a.name


本人智力值5,武力值99。所以有劳各位费心了

使用道具 举报

回复
论坛徽章:
0
17#
发表于 2003-7-28 15:48 | 只看该作者
最初由 li2 发布
[B]楼上的,JAUNT 给的语句逻辑有点问题。按照我的理解应该写成这样:
  1  SELECT (A.ID_1*100+A.ID_2),A.NAME,NVL(T.TOTAL,0)
  2  FROM A, (SELECT (ID_1*100+ID_2)  XX,COUNT(*) AS TOTAL FROM B GROUP BY (ID_1*100+ID_2)) T
  3* WHERE (A.ID_1*100+A.ID_2) = XX(+)
SQL> /

(A.ID_1*100+A.ID_2) NAME                 NVL(T.TOTAL,0)
------------------- -------------------- --------------
                101 long                             2
                102 wang                             1
                201 LI2                               0
                202 w8                                2

这个结果是正确的 [/B]


Sorry, 我没有很仔细看JAUNT的语句,是我的疏忽,你是对的

使用道具 举报

回复
论坛徽章:
0
18#
发表于 2003-7-28 15:51 | 只看该作者
最初由 li2 发布
[B]谁能告诉我下面二个SQL语句的执行结果是不是肯定一致的
1 SELECT (A.ID_1*100+A.ID_2),A.NAME,NVL(T.TOTAL,0)
2 FROM A, (SELECT (ID_1*100+ID_2) XX,COUNT(*) AS TOTAL FROM B GROUP BY (ID_1*100+ID_2)) T
3* WHERE (A.ID_1*100+A.ID_2) = XX(+) ;

第二条:
1 select a.id_1,a.id_2,a.name,count(b.name) from a,b
2 where
3* (a.id_1=b.id_1(+) and a.id_2=b.id_2(+)
group by a.id_1,a.id_2,a.name


本人智力值5,武力值99。所以有劳各位费心了 [/B]


我确信,第二条结果一定是正确的;第一条应该也对

使用道具 举报

回复
论坛徽章:
5
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33蓝色妖姬
日期:2006-04-12 22:10:01会员2006贡献徽章
日期:2006-04-17 13:46:34
19#
 楼主| 发表于 2003-7-28 15:55 | 只看该作者
是不是就是说:
a.id_1=b.id_1(+) and a.id_2=b.id_2(+)  的条件和条件
(A.ID_1*100+A.ID_2) = XX(+)  是一样的  (其中XX通过中间表给出,它的定义为 B.ID_1*100+B.ID_2  )

使用道具 举报

回复
论坛徽章:
23
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:58
20#
发表于 2003-7-29 08:42 | 只看该作者
没太仔细看清楚你第一个帖子给出的数据。

实际上,这样应该是可以的:

select a.id_1, a.id_2, a.name, nvl(t.total, 0)
from a, (select id_1, id_2, count(*) as total from b group by id_1, id_2) t
where a.id_1 = t.id_1(+)
and a.id_2 = t.id_2(+);

子查询里面应该是采用id_1和id_2的分组。原来只写了id_1的分组。

使用道具 举报

回复

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

本版积分规则 发表回复

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