Postgres - Где не работает условие на таблице вложенных соединений - PullRequest
1 голос
/ 16 апреля 2019

У меня есть 3 таблицы: order_items, invoice_items и счета-фактуры

В модели order_items:

has_many :invoice_items

PS order_item может иметь или не иметь какие-либо элементы счета-фактурыс ним

в модели Invoices:

has_many :invoice_items

в модели InvoiceItem

belongs_to :order_item
belongs_to :invoice

таблица order_items содержит booked_quantity и cancelled_quantity полей в ней

таблица счетов содержит поле state.state можно отменить или утвердить

Таблица invoice_items содержит поле quantity.

Элемент заказа считается фактурированным, если выполняется следующее условие:

(booked_quantity - cancelled_quantity - SUM (invoice_items.quantity, где связанный счет не отменен))> 0

Я пытаюсь получить все элементы заказа, которые выставляются для выставления счета, с помощью одного запроса sql.Вот два решения, которые я попробовал:

Решение 1:

SELECT * FROM order_items
       LEFT OUTER JOIN invoice_items ON invoice_items.order_item_id = order_items.id
       INNER JOIN invoices ON invoices.id = invoice_items.invoice_id
       WHERE invoices.state != 'cancelled'
       GROUP BY order_items.id
       HAVING ((booked_quantity - cancelled_quantity - COALESCE(SUM(invoice_items.quantity))) > 0)
       ORDER BY order_items.id ASC

Решение 2:

(
  WITH ii_ord_items AS
  (
    SELECT invoice_items.order_item_id, COALESCE(SUM(invoice_items.quantity), 0) AS uncancelled_invoiced_quantity from order_items
    LEFT OUTER JOIN invoice_items ON invoice_items.order_item_id = order_items.id
    INNER JOIN invoices ON invoices.id = invoice_items.invoice_id
    WHERE invoices.state != 'cancelled'
    GROUP BY invoice_items.order_item_id
  )
  SELECT order_items.* FROM order_items
  LEFT OUTER JOIN ii_oitems ON order_items.id = ii_oitems.order_item_id
  WHERE ( ii_ord_items.uncancelled_invoiced_quantity < (order_items.booked_quantity - order_items.cancelled_quantity))
) AS order_items

Они оба работают нормально, если счет не находится в отмененном состоянии.Но в случае отмены счета они оба дают неверные результаты.Кажется, они также рассматривают количество отмененных счетов.Так что я думаю, что есть некоторая проблема с условием where, но я не мог понять, в чем именно проблема.Любая помощь будет оценена.Заранее спасибо !!

Пример данных:

таблица order_items

id      booked_quantity   cancelled_quantity
1          10                    2

таблица счетов

id      state
1       cancelled

таблица invoice_items

id      invoice_id    order_item_id     quantity
1           1              1               8

Ожидаемый результат: Если я попытаюсь выбрать все элементы заказа, для которых invoice_items может бытьсгенерированный должен включать order_item с идентификатором 1, а счет в настоящее время отменен.Если состояние счета-фактуры было бы чем-то иным, чем «отменено», то order_item с идентификатором 1 не должно присутствовать в результате.

1 Ответ

0 голосов
/ 18 апреля 2019

Для тех, кто застрял в этой / подобной проблеме с этим ... идея состоит в том, что только те элементы счета-фактуры должны быть объединены, где состояние счета отменяется.Если у нас есть два отдельных оператора соединения, то элементы счета будут объединены, даже если состояние счета отменено.Таким образом, в основном, объединение элементов счета-фактуры должно иметь внутренний запрос для фильтрации только соответствующих элементов счета-фактуры.

Вот окончательное решение, которое я реализовал:

 SELECT DISTINCT oi.*
  FROM order_items oi
  LEFT OUTER JOIN
         (SELECT ii.* from invoice_items ii
         INNER JOIN invoices inv
         ON inv.id = ii.invoice_id AND inv.state != 'cancelled') uncancelled_ii
         ON uncancelled_ii.order_item_id = oi.id
  GROUP BY oi.id
  HAVING (booked_quantity - cancelled_quantity - COALESCE(SUM(uncancelled_ii.quantity), 0)) > 0
  ORDER BY oi.id ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...