结合两个mysql查询返回确定而不是行

时间:2018-08-22 06:55:08

标签: mysql

我有一个查询,在该查询中我返回有关发票的一些信息,我将该发票与另一个“付款”表进行比较,以查看该发票(fullamount -fullpaid)是否存在于另一个表中,以及是否执行了某些操作函数不应在我的后端代码中运行。

SELECT  a.status, a.rf_reference, a.payor_orig_id , a.gross_amount + a.type_related_amount as fullamount,
                    a.gross_paid + a.type_related_paid as fullpaid
            FROM    invoice a
            where   a.type = 3 and
                    a.status in (10, 30) and
                    a.UPDATE_DT is null
            having  fullamount > fullpaid
            order   by a.ORIG_ID;

上面的查询返回

status| rf_reference | payor_orig_id | fullamount | fullpaid
30        RF123456        212            1000         200

所以现在我将上面的信息传递给另一个查询,以查看行字段是否匹配。

我这样传递

select * 
from    payment 
where 
       payor_orig_id = 212 and
       rf_reference = RF123456 and
       payment_amount = (1000-200) and
       status = 10 and 
      INSERT_DT BETWEEN DATE_SUB(NOW(), INTERVAL 185 DAY) AND NOW() and
     UPDATE_DT IS NULL;

所以现在上面的代码将返回一行,基本上我不会通过该行运行后端函数。

由于这是两个单独的查询,因此我想将它们合并到一个查询中,以确保添加一个having语句并检查是否返回了 ONLY 行,如果没有匹配项在发票和付款表之间。

SELECT  a.status, a.rf_reference, a.payor_orig_id , a.gross_amount + a.type_related_amount as fullamount,
                a.gross_paid + a.type_related_paid as fullpaid,
                (select b.payment_amount 
                from    payment  b
                where 
                b.payor_orig_id = a.payor_orig_id and
                b.rf_reference = a.rf_reference and
                b.status = 10 and 
                b.INSERT_DT BETWEEN DATE_SUB(NOW(), INTERVAL 185 DAY) AND NOW() and
                b.UPDATE_DT IS NULL) as payment_amount
                FROM    invoice a
                where   a.type = 3 and
                        a.status in (10, 30) and
                        a.UPDATE_DT is null
                having  fullamount > fullpaid and 
                        (fullamount - fullpaid ) <> payment_amount
                order   by a.ORIG_ID;

上面的查询返回“ OK”,这很奇怪,因为我不确定如何调试它。

1 个答案:

答案 0 :(得分:1)

尝试使用NOT EXIST

查看另一个表是否存在
SELECT  a.* , 
    a.gross_amount + a.type_related_amount as fullamount,
    a.gross_paid + a.type_related_paid as fullpaid 
    FROM    invoice a
    where   a.type = 3 and
            a.status in (10, 30) and
            a.UPDATE_DT is null and 
            NOT EXISTS ( select * 
                    from    payment 
                    where 
                            payor_orig_id = a.payor_orig_id and
                            rf_reference = a.rf_reference and
                            payment_amount =  ((a.gross_amount + a.type_related_amount) - (a.gross_paid + a.type_related_paid)) and
                            status = 10 and 
                            INSERT_DT BETWEEN DATE_SUB(NOW(), INTERVAL 185 DAY) AND NOW() and
                            UPDATE_DT IS NULL ) 
            having  fullamount > fullpaid
            order   by a.ORIG_ID;