意思就是如果DISTINCT可以实现对两列的唯一判断的话,需要实现的功能是: SELECT DISTINCT(VARRY1,VARRY2) FROM A TABLEA,B TABLEB WHERE TABLEA.ID=TABLEB.ID
SQL> select * from test2;VARRY1 ID ---------- ---------- a 1 b 1 c 1 x 3 y 4SQL> select * from test3;VARRY2 ID ---------- ---------- g 1 h 1 i 2 f 2 k 3 m 3 n 3 l 3已选择8行。SQL> select varry1, t2.id,varry2 2 from test2 t2, test3 t3 3 where t2.id = t3.id;VARRY1 ID VARRY2 ---------- ---------- ---------- a 1 g b 1 g c 1 g a 1 h b 1 h c 1 h x 3 k x 3 m x 3 n x 3 l已选择10行。我想他的意思可能是在最后这个结果中,对VARRY1,VARRY2分别投影, 然后取出没有重复的值。如果是这样的话,怎么实现啊?呵呵,楼主不知道跑哪儿去了,我不知道是不是这个意思 :)
我没有环境,我说一下思路,你实际验证一下: 得到如下结果后 VARRY1 ID VARRY2 ---------- ---------- ---------- a 1 g b 1 g c 1 g a 1 h b 1 h c 1 h x 3 k x 3 m x 3 n x 3 l 按VARRY1去除重复记录,然后再按VARRY2去除重复记录 最好就是你想要的记录。
不好意思,没看明白你的问题:VARRY1 ID VARRY2 ---------- ---------- ---------- a 1 g b 1 g c 1 g a 1 h b 1 h c 1 h x 3 k x 3 m x 3 n x 3 l如上面的10行纪录,前面三个,随便取一个即可,后面4个,随便取一个也可。你说的“前面三个、后面4个”是根据什么来确定的?上面所有的纪录都是distinct的
楼主的意思是: 这些记录中(现在是10条),首先取出一条: a 1 g, 然后继续取,因为a和g已经出现了,所以以后记录只要包括a或者g的都不再考虑,所以第2条记录应该取到 b 1 h, 然后是x 3 k, ……应该是这么个意思 :)还望弱水兄指教啊!SQL解决了,我再开帖送分 :)
明白了,那可以用sql来完成,为了简化语法,先建立一个view(也可以用子查询来替代): create view myview as select rownum rnum, varry1, t2.id,varry2 from test2 t2, test3 t3 where t2.id = t3.id;然后就可以用rownum的特性来完成判断: select varry1, id, varry2 from myview x where not exists (select 'x' from myview where id = x.id and rnum > x.rnum and (varry1=x.varry1 or varry2=x.varry2));不过这么写的效率是否比过程好我不敢确定(我觉得过程的效率更高一点)
我写的有问题,把rnum > x.rnum改成rnum < x.rnum之后,获得的结果缺少了 b 1 h。我改了一下过程,效率应该有所提高,如下: DECLARE CURSOR mycur IS SELECT * FROM myview; BEGIN DELETE RESULT; --result是结果表 FOR myrec IN mycur LOOP INSERT INTO RESULT SELECT myrec.varry1, myrec.ID, myrec.varry2 FROM DUAL WHERE NOT EXISTS ( SELECT 'x' FROM RESULT WHERE ID = myrec.ID AND ( varry1 = myrec.varry1 OR varry2 = myrec.varry2)); END LOOP; END;
为什么一定要ID = myrec.ID?如果myview理由如下两条记录的话 a 1 g a 3 g那这两条记录都会被INSERT INTO RESULT里面啊。应该去掉ID = myrec.ID吧
如果想得到: SELECT DISTINCT(VARRY1,VARRY2) FROM A TABLEA,B TABLEB WHERE TABLEA.ID=TABLEB.ID 的效果,可以这样:SELECT DISTINCT(VARRY1||VARRY2) FROM A TABLEA,B TABLEB WHERE TABLEA.ID=TABLEB.ID
SELECT DISTINCT(VARRY1,VARRY2) FROM A TABLEA,B TABLEB WHERE TABLEA.ID=TABLEB.ID
---------- ----------
a 1
b 1
c 1
x 3
y 4SQL> select * from test3;VARRY2 ID
---------- ----------
g 1
h 1
i 2
f 2
k 3
m 3
n 3
l 3已选择8行。SQL> select varry1, t2.id,varry2
2 from test2 t2, test3 t3
3 where t2.id = t3.id;VARRY1 ID VARRY2
---------- ---------- ----------
a 1 g
b 1 g
c 1 g
a 1 h
b 1 h
c 1 h
x 3 k
x 3 m
x 3 n
x 3 l已选择10行。我想他的意思可能是在最后这个结果中,对VARRY1,VARRY2分别投影,
然后取出没有重复的值。如果是这样的话,怎么实现啊?呵呵,楼主不知道跑哪儿去了,我不知道是不是这个意思 :)
如上面的10行纪录,前面三个,随便取一个即可,后面4个,随便取一个也可。
谢谢楼上对我问题的描述。:-)
得到如下结果后
VARRY1 ID VARRY2
---------- ---------- ----------
a 1 g
b 1 g
c 1 g
a 1 h
b 1 h
c 1 h
x 3 k
x 3 m
x 3 n
x 3 l
按VARRY1去除重复记录,然后再按VARRY2去除重复记录
最好就是你想要的记录。
如按varry1去处重复纪录,如a,b,c前三条和接着的三条重复,如果简单的删掉前三条或者接着的三条,会导致varry1,varry2的唯一的匹配数减少的。
具体是前面三条中的任一条(varry2有重复,与varry1可以匹配一条),
接着三条中的任一条(情况和前面一样);
最后四条中的任一条(varry1重复,与varry2绑定关系唯一的只可以匹配一条。)
按varry1去除了重复记录,然后再按varry2去除重复记录,就是你要的结果啊。
按varry1去重复记录时,假设用min(),得到
a 1 g
b 1 g
x 3 k
然后再按varry2去的话,就只剩
a 1 g
x 3 k
了,这样的话
b 1 h
会丢失的
你和我一笔纪录,我和你一笔纪录,这样对于你和我就有两条纪录,而你要删掉一条重复的纪录。这种情况只能用pl/sql来实现,我咨询过oracle 公司的人,他们也这么说的。
我也没想出来sql怎么写。
我在别人帮助下的思路是两张表相同ID的数据关联,然后再删除表一varry1重复的纪录,删除表二varry2重复的纪录。
当表一,表二数据量少位多一些,进行两张表关联时会耗费很多时间,因为生成的结果集数量巨大。
我想我问题描述清楚了,燕南飞也理解了我的意思,没有理解我的可以看燕南飞的描述以及我的描述。
---------- ---------- ----------
a 1 g
b 1 g
c 1 g
a 1 h
b 1 h
c 1 h
x 3 k
x 3 m
x 3 n
x 3 l如上面的10行纪录,前面三个,随便取一个即可,后面4个,随便取一个也可。你说的“前面三个、后面4个”是根据什么来确定的?上面所有的纪录都是distinct的
这些记录中(现在是10条),首先取出一条: a 1 g,
然后继续取,因为a和g已经出现了,所以以后记录只要包括a或者g的都不再考虑,所以第2条记录应该取到 b 1 h,
然后是x 3 k,
……应该是这么个意思 :)还望弱水兄指教啊!SQL解决了,我再开帖送分 :)
create view myview as
select rownum rnum, varry1, t2.id,varry2
from test2 t2, test3 t3
where t2.id = t3.id;然后就可以用rownum的特性来完成判断:
select varry1, id, varry2
from myview x
where not exists (select 'x'
from myview
where id = x.id
and rnum > x.rnum
and (varry1=x.varry1 or varry2=x.varry2));不过这么写的效率是否比过程好我不敢确定(我觉得过程的效率更高一点)
使用过程比较好解决--也不是一定就要写出一条sql来解决所有问题。
b 1 h。我改了一下过程,效率应该有所提高,如下:
DECLARE
CURSOR mycur IS SELECT * FROM myview;
BEGIN
DELETE RESULT; --result是结果表
FOR myrec IN mycur LOOP
INSERT INTO RESULT
SELECT myrec.varry1, myrec.ID, myrec.varry2
FROM DUAL
WHERE NOT EXISTS (
SELECT 'x'
FROM RESULT
WHERE ID = myrec.ID
AND ( varry1 = myrec.varry1
OR varry2 = myrec.varry2));
END LOOP;
END;
a 1 g
a 3 g那这两条记录都会被INSERT INTO RESULT里面啊。应该去掉ID = myrec.ID吧
SELECT DISTINCT(VARRY1,VARRY2) FROM A TABLEA,B TABLEB WHERE TABLEA.ID=TABLEB.ID
的效果,可以这样:SELECT DISTINCT(VARRY1||VARRY2) FROM A TABLEA,B TABLEB WHERE TABLEA.ID=TABLEB.ID