PL/SQL 用游标查询结果记录重复 本帖最后由 wendysindy 于 2011-05-26 01:15:36 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 declare cursor cur_1 is select passengerID,Familyname||' '||Givenname Name, StreetNumber||' '||StreetName||' '||StreetType Address, StateName||' '||PostCode PostCode,freqflier from passenger-- natural join flight这个链接基本多余 order by Familyname,PostCode; --如果两个表自然连接: --select a.col_1,b.col_2 --from a natural join b --on a.id=b.idbegin --for循环,自动打开和关闭游标 for e in cur_i loop dbms_output.put_line('ID:'||e.passengerID|| ' Name: '||e.Name|| ' Address: '||e.address|| ' PostCode :'||e.postcode|| ' FrequentFlier: '||e.freqflier); end loop;end;/*自然连接其实就是先将两个表做笛卡尔积,然后再去除重复的行,最后得到结果(不包含重复的行);*/ 游标循环本身本有问题,你的SQL语句有问题 SELECT passengerID, Familyname || ' ' || Givenname NAME, StreetNumber || ' ' || StreetName || ' ' || StreetType Address, StateName || ' ' || PostCode PostCode, freqflier FROM passenger NATURAL JOIN flight ORDER BY Familyname, PostCode;如果两表有相同名称的列,natural join 自动按照相名称的列进行自然等连接,如果没有相同名称的列,则连接就是笛卡尔积,自然连接后面人工指定on连接条件。所以列名不同的连接,最好使用下面这种方式select * from a,b where a.aid=b.bid; 游标没有问题。问题在于你的sql语句 。表连接的时间出现了笛卡尔积。你直接运行sql语句就能发现问题了。 -- 你先看下面这个查询语句返回多少条记录,再来说话,好不好? select passengerID, Familyname||' '||Givenname Name,StreetNumber||' '||StreetName||' '|| StreetType Address, StateName||' '||PostCode PostCode,freqflier from passenger natural join flightorder by Familyname,PostCode;-- 不要想当然:是游标的问题!-- 你的 from passenger natural join flight ,两个表联结,一个联结条件也没有,就相当于两个表做全联结!-- 此时:返回的记录应该是: passenger表的所有记录行*flight表的所有记录行 SQL+Trace 问题 求Microsoft JET Database Engine 错误 '80004005'解决方案 请人大家一个SQL怎么写啊? 求助,sql语句使用函数导致查询时间很长 求: raw-> number,number-> raw 的PL/SQL 函数 大侠们,大侠们,帮我看看这个经典的想法能不能实现啊? 不知道数据库中是否有历史数据的情况下更新问题 我怎么取得日期型数据的月啊 嵌套sql语句的问题 谁有在RED linux 7.2下成功安装过ORACLE 9i ??? 得到上一周一周的日期--oracle 语句不会写 救救我
declare
cursor cur_1 is
select passengerID,Familyname||' '||Givenname Name,
StreetNumber||' '||StreetName||' '||StreetType Address,
StateName||' '||PostCode PostCode,freqflier
from passenger-- natural join flight这个链接基本多余
order by Familyname,PostCode;
--如果两个表自然连接:
--select a.col_1,b.col_2
--from a natural join b
--on a.id=b.id
begin
--for循环,自动打开和关闭游标
for e in cur_i loop
dbms_output.put_line('ID:'||e.passengerID||
' Name: '||e.Name||
' Address: '||e.address||
' PostCode :'||e.postcode||
' FrequentFlier: '||e.freqflier);
end loop;
end;
/*
自然连接其实就是先将两个表做笛卡尔积,然后再去除重复的行,最后得到结果(不包含重复的行);
*/
SELECT passengerID,
Familyname || ' ' || Givenname NAME,
StreetNumber || ' ' || StreetName || ' ' || StreetType Address,
StateName || ' ' || PostCode PostCode,
freqflier
FROM passenger NATURAL
JOIN flight
ORDER BY Familyname, PostCode;
如果两表有相同名称的列,natural join 自动按照相名称的列进行自然等连接,
如果没有相同名称的列,则连接就是笛卡尔积,自然连接后面人工指定on连接条件。
所以列名不同的连接,最好使用下面这种方式
select * from a,b where a.aid=b.bid;
select passengerID,
Familyname||' '||Givenname Name,StreetNumber||' '||StreetName||' '||
StreetType Address,
StateName||' '||PostCode PostCode,freqflier
from passenger natural join flight
order by Familyname,PostCode;-- 不要想当然:是游标的问题!-- 你的 from passenger natural join flight ,两个表联结,一个联结条件也没有,就相当于两个表做全联结!
-- 此时:返回的记录应该是: passenger表的所有记录行*flight表的所有记录行