问题有点复杂,听我慢慢描述,有个一表, 结构如下:supplier_id,product_id,related_product_id1,related_product_id2,related_product_id3表中本来有supplier_id 和product_id ,一个supplier 有至少一个product要求,给每个product 找三个related products. 当然也可能少三个,如果这个supplier 只有少于3个products 的话。
related product 必须属于同一个supplier的。现在做法是 :UPDATE product_ranking pfr SET pfr.related_product_id1= 
 ( SELECT p0.product_id FROM product_ranking p0 
   WHERE p0.supplier_id=pfr.supplier_id AND p0.product_id!=pfr.product_id AND rownum=1) UPDATE product_ranking pfr SET pfr.related_product_id2= 
 ( SELECT p0.product_id FROM product_ranking p0 
   WHERE p0.supplier_id=pfr.supplier_id AND p0.product_id!=pfr.product_id 
   AND p0.product_id!=pfr.related_product_id1 AND rownum=1) UPDATE product_ranking pfr SET pfr.related_product_id3= 
 ( SELECT p0.product_id FROM product_ranking p0 
   WHERE p0.supplier_id=pfr.supplier_id AND p0.product_id!=pfr.product_id 
   AND p0.product_id!=pfr.related_product_id1 AND p0.product_id!=pfr.related_product_id2 AND rownum=1) 这样做的问题是,对于同一个supplier 不同product 基本上都是同样的related 的products, 如下绿色标志数据:
"SUPPLIER_ID","PRODUCT_ID","RELATED_PRODUCT_ID1","RELATED_PRODUCT_ID2","RELATED_PRODUCT_ID3"
6007000000732,8804315839,8817094314,8817094587,8807871093
6007000000732,8807871093,8817094314,8817094587,8817094306
6007000000732,8817094306,8817094314,8817094587,8807871093
6007000000732,8817094314,8817094587,8807871093,8817094306
6007000000732,8817094587,8817094314,8807871093,8817094306怎么才能让3个related product 循环进行呢? 

解决方案 »

  1.   

    你给每个product 找三个related products的规则是什么?依据什么规则来判断是否是一个product的related products ?
    另外,你原表是不是只有supplier_id 和product_id这两个字段?而现在是要多三个related products id 是这样的嘛?
      

  2.   

    gelyon : related products 的原则是属于同一个supplier 即可。 (新的要求是,属于同一个supplier的product的related products 尽量不一样,本来的方法,会有很多是一样的,见上面绿色标出的数据)所有的字段本来就有,但是3个 related product Id 是空。谢!
      

  3.   


    在你内层查询中先加个随机排序后再取呢?order by dbms_random.value()
    如:UPDATE product_ranking pfr SET pfr.related_product_id1=  
     SELECT p0.product_id FROM ( 
     SELECT p0.supplier_id,p0.product_id,ROWNUM rn FROM product_ranking p0  order by dbms_random.value() ) p0
     WHERE p0.supplier_id=pfr.supplier_id AND p0.product_id!=pfr.product_id and rn=1;  只要能保证相同supplier_id下不同product_id就行
    不过你原来的SQL就是可以的,只是你说要同一个supplier的product的related products 尽量不一样
    你这个怎么来保证尽量不一样呢?
    假设同一个supplier的product只有三个,那么此三个product的related products 就肯定是一样的
      

  4.   

    gelyon , 我试了你的方法,可是好像什么都没有update 到,我的意思,run 上面的sql, related_product_id1 仍然是空是的, 旧的方法,对于同一个supplier 下的,所有related_product 基本一样的,都是rownum =1 我说的尽量不一样,不包括同一个supplier 的product 少于等于三个的情况。:)
    我是想做到随机,像你说的那样,或者循环。
      

  5.   

    循环有点困难,因为到最后3个的时候,要从头开始选;
    如果能随机最好。问题我找不出你写的那个sql有什么错,但是就是没有update :(
      

  6.   

    找到了,
    改成:
    UPDATE product_ranking pfr SET pfr.related_product_id1=  
     SELECT p0.product_id FROM ( 
     SELECT * FROM product_ranking p0 order by dbms_random.value() ) p0
     WHERE p0.supplier_id=pfr.supplier_id AND p0.product_id!=pfr.product_id and rownum=1; 就好了.感谢gelyon:P