sql选择具有类似项目的订单

时间:2011-03-03 21:45:38

标签: sql oracle

我需要选择那些在其中具有相同产品的订单。 ORDER_ITEMS包含产品和外键以引用父ORDER行。订单行需要不同。

我已经设法列出了对数,它们中有多少匹配的产品,但这只是相似数。我需要从包含不同产品的货币对中排除订单。

可以在其中包含Oracle特定内容。

这两个表是:

Order(order_id, customer_id...) 
Order_Item(item_id, order_id FK, product_id,...)

我需要使用order_id -s,其所有Order_Item子项都匹配product_id -s。

实施例。在订单

{ (ord1, cust1)  
  (ord2, cust2)}  

和Order_Items

{ (item1, ord1, product_id=3),  
  (item2, ord1, product_id=6),   
  (item3, ord2, product_id=3),   
  (item4, ord2, product_id=6) } 

所以基本上,两个人买了两件完全相同的东西。他们是一对。那些订购产品不完全匹配的订单未列出。

2 个答案:

答案 0 :(得分:2)

你还没有指定db版本,所以我假设11g - 未经测试,但我认为它会给你一般的想法:

SELECT * FROM (
  WITH qry AS (
    SELECT DISTINCT
           order_id
          ,LISTAGG(product_id,'+')
           WITHIN GROUP (ORDER BY product_id)
           AS order_signature
    FROM   order_items
    GROUP BY order_id)
  SELECT order_id
        ,order_signature
        ,COUNT(DISTINCT order_id)
         OVER (PARTITION BY order_signature)
         count_same
  FROM   qry
) WHERE count_same > 1;

限制:如果某些订单非常大,它将无法工作,例如100或1000个产品ID。

答案 1 :(得分:0)

我不确定你的最终数据集是什么样的,但是在WHERE子句中选择带有EXISTS表达式的客户来查找订单匹配将会帮助你。