MSSQL全外连接错误输出

时间:2013-12-30 12:46:15

标签: sql sql-server-2008 full-outer-join

我是MSSQL的新手。我保留纳税人及其买卖发票。

我希望同一行中的特定纳税人的购买和销售发票一起。 我尝试在存储过程中使用完全外连接来按天检索发票。 但它不能按我的意愿工作。这就是我到目前为止所做的:

CREATE PROC InvoiceByDay @InvoiceDate datetime AS
SELECT s.Tax_Payer_ID AS ID, 
  s.Sale_InvoiceID AS [Sale Invoice Number], 
  s.Sale_Total_Amount AS [Total Sale Amount], 
  p.Purchase_InvoiceID AS [Purchase Invoice Number], 
  p.Purchase_Total_Amount AS [Total Purchase Amount]
FROM Sale_Invoice s 
FULL OUTER JOIN Purchase_Invoice p
  ON s.Sale_Date=@InvoiceDate 
  and s.Tax_Payer_ID=p.Tax_Payer_ID 
  and s.Sale_Date=p.Purchase_Date 

这是输出: Output

即使第二行不在指定日期,它仍然在列表中。什么是一个好的解决方案?任何帮助都将受到高度赞赏。

3 个答案:

答案 0 :(得分:2)

即使没有匹配的密钥,full outer join也会保留两个表中的所有记录。我想你想在加入之前进行过滤

SELECT s.tax_payer_id          AS ID, 
       s.sale_invoiceid        AS [Sale Invoice Number], 
       s.sale_total_amount     AS [Total Sale Amount], 
       p.purchase_invoiceid    AS [Purchase Invoice Number], 
       p.purchase_total_amount AS [Total Purchase Amount] 
FROM (SELECT s.* 
      FROM sale_invoice s 
      WHERE s.sale_date = @InvoiceDate
     ) s FULL OUTER JOIN
     (SELECT p.* 
      FROM purchase_invoice p 
      WHERE p.purchase_date = @InvoiceDate
     ) p 
     ON s.tax_payer_id = p.tax_payer_id; 

这应该返回该日期的所有购买和销售记录 - 并且仅在该日期 - 即使没有匹配也是如此。

答案 1 :(得分:1)

我相信你想要WHERE子句中的s.Sale_Date=@InvoiceDate,而不是连接的ON子句。此外,由于您正在使用完全连接,因此您还需要这两个条件,因此您需要添加OR p.Purchase_Date = @InvoiceDate,否则当左表中没有匹配时您将不会获得任何行(因为{{ 1}}将为NULL):

s.Sale_Date

答案 2 :(得分:0)

ON子句的第一部分(即s.Sale_Date=@InvoiceDate)实际上应该在where子句中。你想做类似的事情:

FULL OUTER JOIN Purchase_Invoice p
  and s.Tax_Payer_ID=p.Tax_Payer_ID 
  and s.Sale_Date=p.Purchase_Date
WHERE s.Sale_Date=@InvoiceDate

另请注意,FULL OUTER JOIN将为您提供没有匹配键的行的结果。如果您只想要在两个表格中具有相同纳税人ID和销售日期的记录,请考虑改为使用INNER JOIN