maximkv25
@maximkv25
web-developer

Как сделать сложный запрос по нескольким таблицам?

С достаточно простыми запросами выходит просто, но есть вот такого типа
Входные данные, таблицы:
sale_order, stock_picking, sale_order_line, account_move_line, account_move

Связи между таблицами:
sale_order_line.order_id = many2one(sale_order)
sale_order_line.invoice_lines = many2many(account_move_line)
sale_order_line_invoice_rel(invoice_line_id, order_line_id)

stock_picking.sale_id = many2one(sale_order)
account_move_line.move_id = many2one(account_move)


По каким правилам мне нужно сделать выборку:
Выбрать все sale_order у которых sale_order_line.qty_delivered = 0 and sale_order_line.qty_invoiced and stock_picking > 2 and account_move > 2

Ход мыслей
select so.name
    from sale_order so
        left join stock_picking on so.id = stock_picking.sale_id
        left join sale_order_line as sol on sol.order_id = so.id
        left join sale_order_line_invoice_rel as solir on sol.id = solir.order_line_id
        left join account_move as am on am.id = solir.invoice_line_id
        group by so.name having count(*) > 2


Сложность заключается в правильности выборки и проверки количества выбранных объектов.
Всем заранее спасибо за участие.

Выборка на примере конкретного объекта правильная
select so.name, sol.name, solir.invoice_line_id, sp.id, solir.invoice_line_id
    from sale_order so
        left join sale_order_line as sol on sol.order_id = so.id
        full outer join sale_order_line_invoice_rel as solir on solir.order_line_id = sol.id
        left join stock_picking as sp on so.id = sp.sale_id
    where so.id = 5924
group by so.name, sol.name, sp.id, solir.invoice_line_id


теперь я убираю where so.id = 5924 и мне нужно сделать условие если sp.id > 2 AND solir.invoice_line_id > 2 AND sol.qty_delivered = 0 AND sol.qty_invoiced = 0

Не могу понять что и где для этого добавить?
  • Вопрос задан
  • 60 просмотров
Пригласить эксперта
Ответы на вопрос 1
@VitalyChaikin
Вначале я бы сформировал запрос содержащий ВСЕ поля участвующие в условиях типа
SELECT TOP 20 DISTINCT {Все поля участвующие в условиях} FROM T
LEFT JOIN {Все таблицы} ON {Условия связей}
После того как я убедился бы что запрос получает правильные данные, я бы преобразовал его
SELECT TOP 20 DISTINCT {Все поля участвующие в условиях} {Функция для having} FROM T
LEFT JOIN {Все таблицы} ON {Условия связей}
group by {Все поля участвующие в условиях}
Снова убедимся что {Функция для having} возвращает то что должно быть и добавляем
having {Функция для having}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы