如果连接中使用的第二个表没有任何记录,那么左外连接的结果是什么?

时间:2014-07-22 18:40:57

标签: sql

我有两张桌子sd_billing_h和QM_TESTCERTIFICATEFORMATCUST_T。 第一张桌子的所有帐单都没有。 在我的第二个表中将包含已创建测试证书的账单号。

现在我想只检索那些没有创建测试证书的计费。 billing_no,plant_code是我第一个表的主键.Doc_no和billing no是我第二个表的主键。 在我的第二个表中有一个指示栏,显示为该发票编号创建的测试证书。 我的疑问是,如果第二张表没有任何记录,如果我使用左外连接,如

SELECT A.BILLING_NO AS INVOICE_NO,A.FYEAR 
FROM 
    SD_BILLING_H A 
LEFT OUTER JOIN
    QM_TESTCERTIFICATEFORMATCUST_T B
ON
    A.PLANT_CODE=B.PLANT_CODE
    A.COMPANY_CODE=B.COMPANY_CODE
    A.FYEAR=B.FYEAR
    A.BILLING_NO=B.INVOICE_NO 
WHERE 
    A.PLANT_CODE=@PLANT_CODE 
    AND A.COMPANY_CODE=@COMPANY_CODE 
    AND A.FYEAR=@FYEAR
    AND B.TEST_CERT_IND=1

这会导致第一张表中的所有billing_no。

1 个答案:

答案 0 :(得分:1)

where子句中的此条件会将left outer join变为inner join,因为NULL值始终会失败:

AND B.TEST_CERT_IND = 1

条件位于第二个表格中,因此值 - 当没有匹配时 - 将为NULL

正常的解决方案是将这些条件移到on子句:

ON A.PLANT_CODE=B.PLANT_CODE AND
   A.COMPANY_CODE=B.COMPANY_CODE AND
   A.FYEAR=B.FYEAR AND
   A.BILLING_NO=B.INVOICE_NO AND
   B.TEST_CERT_IND = 1

(我在条款之间添加了AND。)

请注意,第一个表中的条件仍保留在where子句中;这是你在第一个表上过滤的地方。