2011-10-12 119 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

謝謝你的幫助,這是一個有趣的方式來做到這一點,很難理解,但我想我明白了。 –