2011-10-12 129 views
0

我一直有困难,有一段脚本我创造的,并希望一些洞察我做错了SQL脚本,有关相关子查询

问题:

使用相关子查询返回每个供应商的发票,代表供应商最早的发票(具有最早日期的发票)。每行应包含以下四列:供应商名称,发票号码,发票日期和发票总额。

我的脚本:

SELECT DISTINCT Vendor_Name, 
    Invoice_number AS OLDEST_INVOICE, 
    Invoice_date, 
    invoice_total 
FROM Vendors v 
JOIN Invoices i ON v.vendor_id = i.vendor_id 
WHERE invoice_date IN (
     SELECT DISTINCT MIN(invoice_date) 
     FROM invoices i 
     JOIN vendors v ON i.vendor_id = v.vendor_id 
     GROUP BY v.vendor_name 
     ) 
ORDER BY Invoice_Date; 

目前,我的代码是给太多的结果反馈,基本上是我无法确定这invoice_numbers只对最低日期可能被退回。

+2

0_o这是家庭作业,是不是? – 2011-10-12 01:31:52

+0

是的问题是作业,我的脚本是基于问题的基础。我的教授还没有回应我的任何问题,所以这是我的位置: -/ –

回答

1

您需要限制加入到这些发票的特定供应商,并具有最早日期... 你不要;吨menmtion发票表是否具有替代PK ...如果它不“T,尝试:

SELECT 
    v.Vendor_Name, 
    i.Invoice_number as OLDEST_INVOICE, 
    i.Invoice_date, 
    i.invoice_total 
FROM Vendors v 
JOIN Invoices i 
    ON i.vendor_id = v.vendor_id 
     And i.invoice_date = 
      (Select MIN(invoice_date) 
      From Invoices 
      Where vendor_id = v.Vendor_Id) 
ORDER BY i.Invoice_Date; 

如果发票表中有一个替代PK,说InvoiceId,那就试试这个:

SELECT 
    v.Vendor_Name, 
    i.Invoice_number as OLDEST_INVOICE, 
    i.Invoice_date, 
    i.invoice_total 
FROM Vendors v 
    JOIN Invoices i 
     ON i.InvoiceId = 
      (Select InvoiceId 
      From Invoices 
      Where vendor_id = v.Vendor_Id 
       And Invoice_Date = 
        (Select Min(Invoice_Date) 
        From Invoices 
        vendor_id = v.Vendor_Id)) 
ORDER BY i.Invoice_Date; 

前者只使用一个子查询,但后者更真实(更CLE arly表达)查询意图的意图。

0

我对您的建议是不要在WHERE子句中使用子查询,而要在内部JOIN中使用派生表。

SELECT 
    v.Vendor_Name, 
    i.Invoice_number as OLDEST_INVOICE, 
    i.Invoice_date, 
    i.invoice_total 
FROM Vendors v 
JOIN Invoices i ON v.vendor_id = i.vendor_id 
JOIN (SELECT 
     i2.vendor_id, 
     MIN(i2.invoice_date) AS min_invoice_date 
     FROM invoices i2 
     GROUP BY i2.vendor_id) minv 
    ON minv.vendor_id = v.vendor_id 
    AND minv.min_invoice_date = i.invoice_date 
ORDER BY i.Invoice_Date; 
+0

该脚本中缺少表达式,我似乎找不到它。 –

+0

@JOEBENJAMINBLACK问题是派生表中的不同。我已经纠正了答案。 –

+0

谢谢你的帮助,这是一个有趣的方式来做到这一点,很难理解,但我想我明白了。 –