加入不在表sql查询中工作

时间:2014-07-13 12:26:17

标签: sql postgresql grails gorm

我有两张桌子 purchase_bill

id   |customer_supplier |transaction_no
________________________________________
594  |99                | Y
636  |99                | Y

和purchase_bill_return

id   |customer_supplier |transaction_no  |p_id
______________________________________________
523  |99                | Y              |536
624  |99                | Y              |536

我希望以下列方式输出表

id   |pr_id
___________
594  |
636  |523
636  |624

我正在使用SQL查询:

SELECT pb.ID, 
       pr.ID 
FROM   PURCHASE_BILL pb 
       LEFT JOIN PURCHASE_BILL_RETURN pr 
              ON pb.ID = pr.PURCHASE_BILL_ID 
                 AND pb.CUSTOMER_SUPPLIER_ID = pr.CUSTOMER_SUPPLIER_ID 
WHERE  pb.COMPANY_ID = 3 
       AND pr.COMPANY_ID = 3 
       AND pr.TRANSACTION_NO = 'Y' 
       AND pb.TRANSACTION_NO = 'Y' 
       AND pr.COSTOMER_SUPLIER_ID = 99; 

但它只返回两个值:

id   |pr_id

636  |523
636  |624

2 个答案:

答案 0 :(得分:1)

这是因为您将where子句中的过滤器应用于左连接外部的行。如果由于左连接而该行为空,则WHERE pr.company_id = 3将为false(pr.company_id为null,而不是3)。

将pr表上的所有条件移至LEFT JOIN条件而不是WHERE子句中的条件(注意我实际上已将pr.company_id加入到pb.company_id中,而不是将条件放在它们中都是3,只要确保pb.company_id是3并且pr.company_id与它匹配):

select pb.id,pr.id
from purchase_bill pb left join purchase_bill_return pr on  pb.id=pr.purchase_bill_id
    and pb.customer_supplier_id=pr.customer_supplier_id and pr.company_id = pb.company_id
    and pr.transaction_no = pb.transaction_no and pr.costomer_suplier_id=99
where pb.company_id =3 and pb.transaction_no = 'Y'

答案 1 :(得分:0)

选择pb.id,pr.id 来自purchase_bill pb left join buy_bill_return pr on pb.id = pr.purchase_bill_id     和pb.customer_supplier_id = pr.customer_supplier_id和pr.company_id = pb.company_id     和pr.transaction_no = pb.transaction_no 其中pb.company_id = 3和pb.transaction_no =' Y'和pr.costomer_suplier_id = 99