12
返回列表 发新帖
楼主: amani

SQL语句中(+)的用法

[复制链接]
论坛徽章:
0
11#
 楼主| 发表于 2003-7-22 18:04 | 只看该作者
多谢两位!!

使用道具 举报

回复
论坛徽章:
1
12#
发表于 2003-7-22 21:25 | 只看该作者
substr(t1.str1,1,length(t2.str2(+))) 中 (+) 的用法好陌生啊
大虾们能给讲解一下吗?

使用道具 举报

回复
论坛徽章:
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
13#
发表于 2003-7-23 09:19 | 只看该作者
唉,不好意思,我想解释,可是不知道怎么解释。
帮你顶一下,让别的朋友来帮你解释吧。

使用道具 举报

回复
论坛徽章:
1
14#
发表于 2003-7-23 12:47 | 只看该作者
blush
看来偶水平太低了

使用道具 举报

回复
论坛徽章:
0
15#
发表于 2003-7-23 15:57 | 只看该作者
还是不明白,
为什么要加'and t2.str2 is null'呢

使用道具 举报

回复
论坛徽章:
1
16#
发表于 2003-7-23 17:08 | 只看该作者
不知道可不可以这么理解
t1.str1的和t2.str2等长的子串 和 t2.str2 进行外连接
如果所有的t2.str2和t1.str1的子串都不等
则t2.str2为null
这时就是条件要求的不以t2.str2开头的t1.str1

我不太明白的是
函数参数彼此间也可以做外连接吗?

这道题如果是我做
可能只会用 minus 或者 not in 了
差距太大
唉。。

最初由 zxyfxt 发布
[B]还是不明白,
为什么要加'and t2.str2 is null'呢 [/B]

使用道具 举报

回复
论坛徽章:
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
17#
发表于 2003-7-23 18:07 | 只看该作者
TO: TsuLeon
你对外连接的理解不正确

正常的表连接应该没问题,外连接就是在不满足连接条件的情况下使用空行去匹配
这里的连接条件当然不只是那种简单的相等条件,可以是很复杂的条件,
比如是多个条件复合成两个表之间的一个连接条件。

这里的 substr(t1.str1,1,length(t2.str2(+)))=t2.str2(+)  是一个外连接,其连接条件是
substr(t1.str1,1,length(t2.str2))=t2.str2 ,只是这个连接条件比一般的
t1.str1 = t2.str2 这一类的条件要复杂一些罢了。
Oracle 首先从 t1 中取出一行,再在 t2  中取所有的行进行 substr(t1.str1,1,length(t2.str2))=t2.str2
条件测试,如果是真,则保留该行,如果 t2 中没有任何行满足条件,则 t2 使用一个空行,
即所有字段值均为 null ;这完成一次匹配,接下来再在 t1 中取下一行....

而 and t2.str2 is null 不属于连接条件,它是一个筛选条件,是用在表连接过后的结果上
进行筛选。

现在给你描述一个复杂的连接条件,修改一下上面的 where 条件
比如:
where substr(t1.str1,1,length(t2.str2(+)))=t2.str2(+)
and length(t2.str2(+)) > 3
你能解释吗?
这里连接条件将是:
substr(t1.str1,1,length(t2.str2))=t2.str2
and length(t2.str2) > 3
而不再是单纯的 substr(t1.str1,1,length(t2.str2))=t2.str2 了

使用道具 举报

回复
论坛徽章:
1
18#
发表于 2003-7-23 22:27 | 只看该作者

谢谢!

感谢!
有点儿感觉了
前一个为连接条件
后一个为筛选条件

首先通过连接条件
select t1.str1, t2.str2
from   t1, t2
where  substr(t1.str1,1,length(t2.str2)) = t2.str2
得到
str1   str2
-------------------------
abcdefg abc
这实际上是所要求结果的余集

通过外连接条件
select t1.str1, t2.str2
from   t1, t2
where  substr(t1.str1,1,length(t2.str2(+)))=t2.str2(+)
得到
str1   str2
-------------------------
abcdefg abc
bcdefg
再加上筛选条件 t2.str2 is null,就得到所求结果

我试了一下
这个外连接条件中的两个 (+) 缺一不可
否则都会导致error: ora-01417

后一个例子讲解的是如何将一个复杂连接条件改为外连接
其中陌生而有意思的还是
length(t2.str2(+)) > 3 中的 (+)

大略知道了点如何用(+) HOW
但还不太清楚为什么能这么用 WHY
好像8.1.7版的sql reference中都没有这种使用方法的介绍

使用道具 举报

回复

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

本版积分规则 发表回复

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