Перечислите столбец соединения как нулевое значение, если в другой таблице нет совпадений - PullRequest
0 голосов
/ 08 февраля 2019

Моя проблема проста: я хочу перечислить все из моей таблицы «form», и если в «выдающейся» таблице нет совпадений с этой «формой», то эта строка должна быть также указана только с NULL встолбец PAYED_GROSS_AMOUNT (например, для этого столбца используется «выдающаяся» таблица).Прямо сейчас с этим запросом все, что я получаю, это совпадения «формы», в которых также есть соответствующие записи в «выдающейся» таблице:

SELECT 
    `f`.`ID`                            AS `ID`,
    `f`.`FORM_NR`                           AS `form_nr`,
    `f`.`DELIVERY_DATE`                         AS `delivery_date`,
    `f`.`FORM_DATE`                         AS `form_date`,
    `f`.`PAYMENT_DATE`                      AS `payment_date`,
    MAX(`os`.`PAYED_DATE`)                      AS `payed_date`,
    `fi`.`GROSS_MONEY`                          AS `gross_money`,
    `fi`.`NET_PRICE`                        AS `net_price`,
    ifnull(SUM(`os`.`PAYED_GROSS_AMOUNT`), 0)                       AS `payed_gross_amount`,
    ifnull((`fi`.`GROSS_MONEY`  
     - SUM(`os`.`PAYED_GROSS_AMOUNT`)),
     `fi`.`GROSS_MONEY`)                        AS `remaining_amount`
    FROM  `form` `f`
    LEFT JOIN `outstanding` `os` ON `f`.`ID` = `os`.`INVOICE_ID`,
    (SELECT form_id          AS `FORM_ID`, 
                  SUM(gross_money) AS `GROSS_MONEY`, 
                  SUM(net_price)   AS `NET_PRICE` 
           FROM   form_item
           GROUP  BY form_id) fi
    WHERE `f`.SUBTYPE <> 3
    AND   `fi`.FORM_ID = `f`.ID
    AND   `f`.STATUS = 2
    AND   `f`.DIRECTION = 1
    AND   `os`.DELETED <> 'deleted' 
    AND   (`f`.PAYMENT_TYPE = 2 OR `f`.PAYMENT_TYPE = 4)
    AND   `f`.FORM_TYPE = 'Invoice'
    AND `f`.deleted <> 'deleted' 
    GROUP BY `f`.`ID`, 
             `fi`.`form_id` 
    ORDER BY `f`.`FORM_DATE` DESC;

Я также пытался с LEFT OUTER JOIN, но безуспешно: (

Спасибо!

РЕДАКТИРОВАТЬ:

Запрос максимально упрощен (вы можете игнорировать предложения WHERE в конце)

Ожидаемый результат:

таблица форм:

ID FORM_NR ...
1  2019/1
2  2019/2
3  2019/4
4  2019/7
...

ожидающая таблица:

INVOICE_ID  PAYED_DATE  PAYED_GROSS_AMOUNT ...
2           2019-02-05  100
3           2019-02-06  200
...

Результат:

FORM_NR  FORM_DATE  ... PAYED_DATE  PAYED_GROSS_AMOUNT
2019/1   2019-02-01     null        0
2019/2   2019-02-02     2019-02-05  100
2019/4   2019-02-03     2019-02-06  200
2019/7   2019-02-04     null        0
...

PAYED_GROSS_AMOUNT из-за метода IFNULL 0, а не NULL.

1 Ответ

0 голосов
/ 08 февраля 2019

Используйте NOT EXISTS.Как то так:

select . . .
from form f
where <conditions on form> and
      not exists (select 1
                  from outstanding o
                  where o.form_item = f.id and
                        <conditions on outstanding>
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...