Oracle - Внешнее соединение с условием соединения - PullRequest
0 голосов
/ 15 марта 2020

У меня есть сценарий, в котором у меня две таблицы

ЗАКАЗ

ORDER_NO
LOCATION
ITEM
QTY_RECEIVED

ПЕРЕСЫЛКА

ORDER_NO
LOCATION
ITEM
QTY_RECEIVED

Существуют случаи, когда в таблице ORDER есть запись, но в таблице SHIPMENT нет

Я хочу, чтобы все строки в таблице ORDER не были равны qty в таблице SHIPMENT, и это будет включать строки, которые там в ЗАКАЗ, но не в отгрузке.

Я пытался сделать это:

SELECT 
    order_no, item, location, SUM(NVL(QTY_RECEIVED, 0)) 
FROM
    ORDERS ol                     
GROUP BY 
    ORDER_NO, ITEM, LOCATION
HAVING 
    SUM (NVL(ol.QTY_RECEIVED,0)) <>      

    (SELECT SUM(NVL(sk.QTY_RECEIVED, 0))
     FROM shipment s
     WHERE s.order_no = ol.order_no
       AND s.item (+)= ol.item
       AND s.location (+) = ol.location
     GROUP BY s.order_no, s.item, s.location);

Но это не дает правильного результата.

как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 15 марта 2020

Вам нужно LEFT JOIN, чтобы вернуть результаты даже для несуществующих значений таблицы SHIPMENT:

SELECT ol.order_no, ol.item, ol.location, 
       SUM(NVL(ol.QTY_RECEIVED, 0)) AS "Total Quantity Of Orders",
       SUM (NVL(s.QTY_RECEIVED,0))  AS "Total Quantity Of Shpm." 
  FROM orders ol 
  LEFT JOIN shipment s  
    ON s.order_no = ol.order_no
   AND s.item = ol.item
   AND s.location = ol.location
 GROUP BY ol.order_no, ol.item, ol.location
HAVING SUM (NVL(ol.QTY_RECEIVED,0)) <> SUM (NVL(s.QTY_RECEIVED,0)) 
1 голос
/ 15 марта 2020

Мне кажется, что в заказе может быть несколько отправлений для одного и того же товара. Если это так, вам нужен другой подход:

select order_no, location, item, sum(o_qty), sum(s_qty)
from ((select order_no, location, item, qty_received as o_qty, 0 as s_qty
       from orders
      ) union all
      (select order_no, location, item, 0 as o_qty, qty_received as s_qty
       from shipment
      )
     ) os
group by order_no, location, item
having sum(o_qty) <> sum(s_qty);
...