oracle ebs 工作心得

更新时间:2023-10-17 16:37:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

PL/SQL 部分

select a.sno,a.sname , (select a.sname from dual a where rownum =1)

haa from song a;

--对于括号里的查询 select 列表里有个a 到底是指的是里面dual 还是外面的song表呢 当 dual 有 字段sname时 a.sname 只的就是dual 如果 dual根本没有字段sname 它会去外层查询 的表里找 如果 还没有 才会报错 有的话 就指的是外面的表 所以 最好明确 要指的是谁 这种情况简称最好保持 不一致

对于用外连接 还是用内连接的一些理解:

像此处 我商品信息基本表里保存了一个“外键”商品类别ID(其实没有真正的建立外键),用以关联外键信息(商品名称等等),我觉得我在建立这个块视图的时候 还是用外连接好, 理由如下:

我们先查看我们的商品类别的快速编码信息 画面如下:

现在我们删除第2行 我们发现我们成功了(我们也应该让他成功 不能因为这个电子类别 已经被引用了而不允许删除 再说 如果要这么做 也不科学 到时系统大了 我们也不确定这个快速编码会被哪些表引用 我们当然可以通过外键来实现 当被引用时不允许删除 但这样就不够灵活了 我们的数据库也不提倡建立外键),画面如下:

假如 如果我用内连接来连接类别 这时 我们在商品信息的form里将查不到以前用到过电子这一类别的 所有记录行了

分析如何判断是否用内连接还是用外连接: 1:我们可以分析哪个表的记录更重要 像这里我们的商品信息是更重要的 由于种种原因 可能商品类别会被篡改,删除等等 我们不能因为这些 就把原先有的商品信息过滤掉 不让它们显示出来

2:我们应该分析需求 ,比如我们要查看订单信息 想知道有多少张订单 即使没有订单行业没关系 或者 我只关心 订单头的信息 行的记录并不是很关心(也不是完全不关心 这里假设 只是稍微“关心”一下) 此时我们也应该用外连接

什么时候用内连接: 我们要求“查出来的结果”相互依存 有a必须有b 比如b表的信息很重要 有b必须有a 比如不然b记录作废 则此时我们就必须用内连接了 举例如下:

我们要查看某某商品的销售情况 如多少数量等等 比如订单头表为head 行表为line

我们应该写如下语句 select count(qty) from head h, line l where h.head_id=l.head_id and item_id=’abc’

理由:(head 在左 line 在右)

1 如果有头记录 没有行记录 我们直接排除 因为我们要数量 没有行记录则没有数量 这样我们排除掉了用左外连接

2:如果有行记录 没有头记录(正常情况,系统是不应该有这情况的) 像这样的行记录我们应该是认为无效的 作废的 所以右外连接 也不可取 3:根据上面的分析 我们应该用内连接

我觉得 我们到底用什么连接 应该视我们需要什么样的数据? 是否允许 有 a表的记录 然后没有b表的记录? 还是反之? 还是必须都互相有?

像上面的商品信息 关联类型信息一样,我们可以这样问自己: 1:我们的结果集里 当没有类型信息是 商品的信息还显示吗?

2:还是我们要的结果集里 必须有类型信息 不然 这样的商品信息不显示? 3:我们不应该这样问,因为数据库里 有商品信息表里是 肯定会有类型信息的 假设真这样的话 用内连接 和用外连接其实就结果一样了(商品信息表 内连接商品类型信息 和商品信息左外连接商品类型信息)

像第一个例子:我们不应该让小小的不重要的商品类型信息 影响到 商品信息的查看 商品信息在那form里是最主要的信息 用户想看到的信息 像第2个例子:我们需要数量 但是有过只有订单头 又有何用? 如果有订单行 没有头?这信息就是非法的 无效的 所以 这样的我们就用内连接

对oracle 连接写法的一些归纳 一些易错的地方的分析 注意点1:

有一个表 song 记录如下:

有一个表song1记录如下:

我们执行如下查询

select a.sno as a_sno,b.sname as b_sname from song a, song1 b where a.sno=b.sno(+) 结果如下:

结果使我们预想的那样 没有错 然后我再执行如下查询:

select a.sno as a_sno,b.sname as b_sname from song a, song1 b where a.sno=b.sno(+) and b.sname<>'flash' 结果如下:

为什么会这样呢? 是因为我们加的b.sname<>'flash' 条件 是在表song和song1通

过连接a.sno=b.sno(+) 执行完之后 再筛选的

(那这里为什么第3行没有出来 是因为 第3行的B_SNAME 为null null也是不等于‘flash’的 null 是未知的 不等于任何值 也不“不等于”任何职)

分步:

连接完之后的结果集为:

再b.sname<>'flash' 筛选

结果集当然就变成这个了 如下:

(那这里为什么第3行没有出来 是因为 第3行的B_SNAME 为null null也是不等于‘flash’的 null 是未知的 不等于任何值 也不“不等于”任何职)

它并不是先通过b.sname<>'flash'去筛选 song1 表 再 连接的 如果是先筛选的话 其语句应该等同于下面的语句:

select a.sno as a_sno,b.sname as b_sname from song a, (select * from song1 where sname<>'flash') b where a.sno=b.sno(+)

其结果为:

根据以上 我们得出的结论是 b.sname<>'flash' 是连接结果集出来之后 再对那个结果集进行筛选.

注意点二:

如果我们所加的条件是针对左边的表 即

select a.sno as a_sno,b.sname as b_sname from song a, song1 b where a.sno=b.sno(+) and a.sname<>'flash' 其执行效果 和

select a.sno as a_sno,b.sname as b_sname from (select * from song where sname<>'flash') a, song1 b where a.sno=b.sno(+) 其结果集都为:

因为 左边的表为基表 先 筛选基表 再去连接 还是先连接 再筛选连接结果 其结果不难想象应该是一样 只是执行顺不一样而已

如果是内连接呢

select a.sno as a_sno,b.sname as b_sname from song a, song1 b where a.sno=b.sno and a.sname<>'flash' 的 执行结果 和

select a.sno as a_sno,b.sname as b_sname from (select * from song where sname<>'flash') a, song1 b where a.sno=b.sno 的执行结果也是一样的 (虽然 执行的顺序不同)

根据上面 我得出的结论是:

1:类似如 “其中一个表的字段(或相关的)= (或其他运算符)一个和另一个表无关的”where条件 他是不参与连接的 他是在连接后 再对连接结果进行筛选的 2:写左连接时(左表a 右表b) 如果 是进一步对a表进行删选 如a.id=123 等等 其和先对a表进行筛选 再来和b左连接 其效果是一样的 (右连接也一样)

如果是加 b.id=123这样的条件 我们就要注意了 我们就要分析 到底是要先对b进行筛选 还是 对最终结果的筛选 因为他们的执行结果是不一样的 不注意就会写错 如果 是要先 筛选b 再连接 我们就要这样写 123=b.id(+);(其实我们可以理解为 123是a表中的一个字段 中的值 对于a表每一行 其值都为123 如果我们是要对最终结果的筛选 直接写成123=b.id就好了

3:通过上面2的分析 对外连接的辅助表( 左连接时的右表 右连接时的左表) 添加类似id=123的where条件时 我们才需要格外主要 是否要在id后面加(+)号 因为 其他情况 其结果是一样的

补充说明:

现在执行如下查询:

select a.sno as a_sno, b.sname as b_sname from song a ,song1 b where a.sno=b.sno(+); 其结果为:

如果我只要连接 b表中 sname=’flash’的记录呢?即我要得出如下结果集 :

查询语句该怎么写呢 可以这样写:

select a.sno as a_sno, b.sname as b_sname from song a ,song1 b where a.sno=b.sno(+) and 'flash'=b.sname(+);

这里我们可以理解为 ‘flash’为a存在一列,而且其列值总为flash 即上面语句类似如下:

select a.sno as a_sno, b.sname as b_sname from (select 'flash' col ,song.* from song) a ,song1 b

where a.sno=b.sno(+) and a.col=b.sname(+);

如果我要限制左边表 我要的结果集是: 只有a表中sno=5的才去连接 b表中的sno 该怎么写呢? 我们这样写是错:

select a.sno as a_sno, b.sname as b_sname from song a ,song1 b where a.sno=b.sno(+) and a.sno=5(+) ;

根据上面的变通写法 我们可以把5理解为b中存在一列 其列值总为5,即我们可以这样写:

select a.sno as a_sno, b.sname as b_sname from song a , (select 5 as col , song1.* from song1) b

where a.sno=b.sno(+) and a.sno=b.col(+) 我们得到的结果集为:

这正是我们要的结果.

本文来源:https://www.bwwdw.com/article/4pvf.html

Top