希望通过彼此的id关联,找到相同id中的记录最多的一一对应关系,如:
a,1,g
b,1,h
x,3,k
不明白?

解决方案 »

  1.   

    意思就是如果DISTINCT可以实现对两列的唯一判断的话,需要实现的功能是:
    SELECT DISTINCT(VARRY1,VARRY2) FROM A TABLEA,B TABLEB WHERE TABLEA.ID=TABLEB.ID
      

  2.   

    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分别投影,
    然后取出没有重复的值。如果是这样的话,怎么实现啊?呵呵,楼主不知道跑哪儿去了,我不知道是不是这个意思 :)
      

  3.   

    i am here,waiting for answer,hehe
      

  4.   

    yeah.我的意思就是你说的,取出没有重复的值即可,当然匹配数要满足最多的。
    如上面的10行纪录,前面三个,随便取一个即可,后面4个,随便取一个也可。
    谢谢楼上对我问题的描述。:-)
      

  5.   

    我没有环境,我说一下思路,你实际验证一下:
    得到如下结果后
    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去除重复记录
    最好就是你想要的记录。
      

  6.   

    浪子兄,去重复记录的方法,CSDN这儿也有好多了。但是除了DISTINCT就是ROWID,这儿最后这个结果是一个子查询,不支持ROWID的啊,还有什么好的方法吗?
      

  7.   

    jiezhi(西域浪子) ,刚刚没仔细看你的思路,现在发现是不对的。
    如按varry1去处重复纪录,如a,b,c前三条和接着的三条重复,如果简单的删掉前三条或者接着的三条,会导致varry1,varry2的唯一的匹配数减少的。
      

  8.   

    我需要得到的是前面10条纪录中可以获得三条varry1,varry2的唯一最大匹配数;
    具体是前面三条中的任一条(varry2有重复,与varry1可以匹配一条),
    接着三条中的任一条(情况和前面一样);
    最后四条中的任一条(varry1重复,与varry2绑定关系唯一的只可以匹配一条。)
      

  9.   

    如果把你的varry1和varry2作为一个字段varry,那就是任何一个varry都不和其他的varry有相同的地方,对不对?
    按varry1去除了重复记录,然后再按varry2去除重复记录,就是你要的结果啊。
      

  10.   

    不行啊,老兄,你去重复记录的时候一般使用min()或者max()吧:
    按varry1去重复记录时,假设用min(),得到
    a 1 g
    b 1 g
    x 3 k
    然后再按varry2去的话,就只剩
    a 1 g
    x 3 k
    了,这样的话
    b 1 h
    会丢失的
      

  11.   

    你的问题是不是可以这样认为找出在同一个部门里的人,比如:你和我在一个部门里,用sql查出来只能是
    你和我一笔纪录,我和你一笔纪录,这样对于你和我就有两条纪录,而你要删掉一条重复的纪录。这种情况只能用pl/sql来实现,我咨询过oracle 公司的人,他们也这么说的。
    我也没想出来sql怎么写。
      

  12.   

    pl/sql在顶楼已经实现了,但是有一个执行效率问题。
    我在别人帮助下的思路是两张表相同ID的数据关联,然后再删除表一varry1重复的纪录,删除表二varry2重复的纪录。
    当表一,表二数据量少位多一些,进行两张表关联时会耗费很多时间,因为生成的结果集数量巨大。
    我想我问题描述清楚了,燕南飞也理解了我的意思,没有理解我的可以看燕南飞的描述以及我的描述。
      

  13.   

    不好意思,没看明白你的问题: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的
      

  14.   

    楼主的意思是:
    这些记录中(现在是10条),首先取出一条: a 1 g,
    然后继续取,因为a和g已经出现了,所以以后记录只要包括a或者g的都不再考虑,所以第2条记录应该取到 b 1 h,
    然后是x 3 k,
    ……应该是这么个意思 :)还望弱水兄指教啊!SQL解决了,我再开帖送分 :)
      

  15.   

    明白了,那可以用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));不过这么写的效率是否比过程好我不敢确定(我觉得过程的效率更高一点)
      

  16.   

    弱水兄:还是有问题的 :)这样的话,对于第一行,如果下面有和他重复的VARRY1或者VARRY2的话,则第一行始终不会被检索到的。而且第二行和第三行也会被排除的,所以有丢失。而最后一行始终会被检索出来的,即使有重复。另外我觉得id = x.id应该没有什么必要把
      

  17.   

    写sql比较难--我没有想出来:(
    使用过程比较好解决--也不是一定就要写出一条sql来解决所有问题。
      

  18.   

    我写的有问题,把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;
      

  19.   

    为什么一定要ID = myrec.ID?如果myview理由如下两条记录的话
    a 1 g
    a 3 g那这两条记录都会被INSERT INTO RESULT里面啊。应该去掉ID = myrec.ID吧
      

  20.   

    如果想得到:
    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
      

  21.   

    楼上的兄弟distinct(varry1||varry2)可以达到distinct(varry1,varry2)的效果的。我是要对varry1,varry2都唯一,通过连字符合成的字段,只要varry1,varry2其中一个唯一,合成字段就变成唯一了。