我是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
这是输出:
即使第二行不在指定日期,它仍然在列表中。什么是一个好的解决方案?任何帮助都将受到高度赞赏。
答案 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
。