我有两张桌子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。
答案 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
子句中;这是你在第一个表上过滤的地方。