【问题标题】:sql select orders with similar itemssql 选择商品相似的订单
【发布时间】:2011-03-03 21:45:37
【问题描述】:

我需要成对选择其中包含相同产品的订单。 ORDER_ITEMS 包含产品和一个外键来引用父 ORDER 行。订单行需要不同。

我已经设法列出了配对,计算其中有多少匹配产品,但这只是一个相似性计数。我需要从包含不同产品的配对中排除订单。

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

这两个表是:

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

我需要让所有 Order_Item 子项都匹配 product_id-s 的 order_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) } 

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

【问题讨论】:

  • 所以写下你的查询,也许有人会帮助你。我们不会做你的功课。
  • 我们需要两个表的 CREATE TABLE 语句来知道有哪些列。样本数据和基于数据的预期输出将帮助我们能够为您提供帮助。什么版本的 Oracle?
  • 将问题提出来是否更好:列出多个订单中使用的产品以及订单信息?
  • 不,我不想列出产品,我想列出具有匹配产品的订单(从订单中我会去真正成为客户,但基本想法可以在这两个上完成表,不需要在这里写整个架构):)
  • 这两个表是 Order(order_id, customer_id...) 和 Order_Item(item_id, order_id FK, product_id,...)。我需要使用具有匹配 product_id-s 的所有 Order_Item 子项的 order_id-s。前任。在 Orders { (ord1, cust1) and (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 个人买了完全相同的 2 件东西。他们是一对。那些订购的产品不完全匹配的订单不会被列出。

标签: sql oracle


【解决方案1】:

你没有指定数据库版本,所以我假设 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。

【讨论】:

  • 准确地说,您假设是 11gR2。 listagg() 在任何早期版本中均不可用。
  • 对于 Oracle 10,您可以将 listagg 替换为 wmsys.wm_concat(),尽管我不记得它是否已默认安装和公开,或者您是否需要让 DBA 使其可用。跨度>
【解决方案2】:

我不确定您的最终数据集需要是什么样子,但是从 WHERE 子句中带有 EXISTS 表达式的客户中选择以查找订单匹配项会让您到达那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2016-02-01
    • 1970-01-01
    • 2017-02-24
    相关资源
    最近更新 更多