mysql - 如果其他表中没有匹配项,则将连接列列为空值

标签 mysql sql

我的问题很简单:我想列出“form”表中的所有内容,如果“outstanding”表中没有与此“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。

最佳答案

使用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>
                 );

关于mysql - 如果其他表中没有匹配项,则将连接列列为空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54587289/

相关文章:

mysql - 具有多个 SELECT 语句的 SQL

SQL - 如何使用插入的输出来更新表

mysql - 模型中的错误检查

java - 灵活的搜索查询可根据依赖关系选择实体

mysql - 如何读取 innodb 日志文件?

php - MySQL/PHP : how to display only one category with related items

java - 如何安装 com.mysql.jdbc.Driver "Could not find driver with class name: com.mysql.jdbc.Driver"?

php - 使用 PHP 循环向 MySQL 表添加多列

mysql - 如何使用 Hibernate 命名查询 (HQL) 在 MYSQL 的时间戳字段中搜索当前日期?

sql - 空 BLOBS - SQL Server