0

我是 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 

这是输出: 输出

即使第二行不在指定的日期,它仍然在列表中。有什么好的解决方案?任何帮助将不胜感激。

4

3 回答 3

2

Afull 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; 

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

于 2013-12-30T12:51:32.147 回答
1

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

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.Tax_Payer_ID=p.Tax_Payer_ID 
  and s.Sale_Date=p.Purchase_Date 
WHERE s.Sale_Date = @InvoiceDate 
OR p.Purchase_Date = @InvoiceDate
于 2013-12-30T12:52:04.413 回答
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改用。

于 2013-12-30T12:53:02.793 回答