sql выбрать заказы с похожими предметами - PullRequest
1 голос
/ 04 марта 2011

Мне нужно выбрать те заказы в парах, которые имеют одинаковые продукты в них. 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.

Ex. в заказах

{ (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 ]

2 голосов
/ 04 марта 2011

Вы не указали версию БД, поэтому я предполагаю, что 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 идентификаторов продукта.

0 голосов
/ 04 марта 2011

Я не уверен, как должен выглядеть ваш окончательный набор данных, но выбор из Customer с выражением EXISTS в предложении WHERE для поиска совпадений заказов приведет вас туда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...